Вычисление разницы между двумя экземплярами даты Java
Я использую Java java.util.Date
класс в Scala и хотите сравнить a Date
объект и текущее время. Я знаю, что могу вычислить дельту с помощью getTime ():
(new java.util.Date()).getTime() - oldDate.getTime()
однако, это просто оставляет меня с long
представляющее миллисекунды. Есть ли более простой и приятный способ получить временную дельту?
30 ответов:
JDK
Date
API ужасно сломан, к сожалению. Я рекомендую использовать библиотека времени Джоды.время Джоды имеет понятие времени интервал:
Interval interval = new Interval(oldTime, new Instant());
EDIT: кстати, у Джоды есть два понятия:
Interval
для представления интервала времени между двумя моментами времени (представляют время между 8 утра и 10 утра), иDuration
что представляет собой отрезок времени без фактических временных границ (например, представляют два несколько часов!)если вы заботитесь только о времени сравнения, большинство
Date
реализации (включая JDK один) реализуетComparable
интерфейс, который позволяет использоватьComparable.compareTo()
простой diff (без lib)
/** * Get a diff between two dates * @param date1 the oldest date * @param date2 the newest date * @param timeUnit the unit in which you want the diff * @return the diff value, in the provided unit */ public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) { long diffInMillies = date2.getTime() - date1.getTime(); return timeUnit.convert(diffInMillies,TimeUnit.MILLISECONDS); }
и тогда вы можете позвонить:
getDateDiff(date1,date2,TimeUnit.MINUTES);
чтобы получить разницу из 2 дат в минутах единицы.
TimeUnit
иjava.util.concurrent.TimeUnit
, стандартное перечисление Java, идущее от наносов до дней.
человек читаемый diff (без lib)
public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) { long diffInMillies = date2.getTime() - date1.getTime(); List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class)); Collections.reverse(units); Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>(); long milliesRest = diffInMillies; for ( TimeUnit unit : units ) { long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS); long diffInMilliesForUnit = unit.toMillis(diff); milliesRest = milliesRest - diffInMilliesForUnit; result.put(unit,diff); } return result; }
выход что-то вроде
Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
, С упорядоченными единицами.вы просто нужно преобразовать эту карту в удобную для пользователя строку.
предупреждение
приведенные выше фрагменты кода вычисляют простую разницу между 2 мгновениями. Это может вызвать проблемы во время перехода на летнее время, как описано в этот пост. Это означает, что если вы вычисляете разницу между датами без времени, у вас может отсутствовать день/час.
на мой взгляд, разница в дате является своего рода субъективной, особенно в дни. Вы май:
подсчитайте количество 24h прошедшего времени: День+1-день = 1 день = 24h
подсчитайте количество прошедшего времени, заботясь о переходе на летнее время: день+1-день = 1 = 24h (но с использованием полуночного времени и летнего времени это может быть 0 день и 23h)
подсчитать количество
day switches
, что означает День+1 1pm-день 11am = 1 день, даже если прошедшее время составляет всего 2 часа (или 1 час, если есть переход на летнее время :p)мой ответ действителен, если ваше определение даты diff по дням соответствует 1-му случаю
С JodaTime
если вы используете JodaTime вы можете получить diff для 2 мгновений (millies backed ReadableInstant) даты с:
Interval interval = new Interval(oldInstant, new Instant());
но вы также можете получить разницу для местных дат / времени:
// returns 4 because of the leap year of 366 days new Period(LocalDate.now(), LocalDate.now().plusDays(365*5), PeriodType.years()).getYears() // this time it returns 5 new Period(LocalDate.now(), LocalDate.now().plusDays(365*5+1), PeriodType.years()).getYears() // And you can also use these static methods Years.yearsBetween(LocalDate.now(), LocalDate.now().plusDays(365*5)).getYears()
int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) / (1000 * 60 * 60 * 24) )
обратите внимание, что это работает с датами UTC, поэтому разница может быть выходным днем, если вы посмотрите на местные даты. И получение его для правильной работы с местными датами требует совершенно другого подхода из-за летнего времени.
вам нужно более четко определить свою проблему. Ты может просто возьмите количество миллисекунд между двумя
Date
объекты и делим на количество миллисекунд в 24 часа, например... но:
- это не будет принимать во внимание часовые пояса -
Date
всегда в UTC- это не будет принимать во внимание летнее время (где могут быть дни, которые только 23 часов, например)
- даже в пределах UTC, сколько дней есть в 16 августа 11 вечера до 18 августа 2 утра? Это всего лишь 27 часов, значит, один день? Или это должно быть три дня, потому что он охватывает три даты?
С помощью java.время фреймворк встроенный в Java 8+:
ZonedDateTime now = ZonedDateTime.now(); ZonedDateTime oldDate = now.minusDays(1).minusMinutes(10); Duration duration = Duration.between(oldDate, now); System.out.println("ISO-8601: " + duration); System.out.println("Minutes: " + duration.toMinutes());
выход:
ISO-8601: PT24H10M
мин: 1450
для получения дополнительной информации см. Oracle Tutorial и ISO 8601 стандартные.
tl; dr
преобразовать устаревшие
java.util.Date
предметы для их замены,java.time.Instant
. Затем вычислите затраченное время какDuration
.Duration d = Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds. myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class. Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example. ) ;
d. toString (): PT2H34M56S
d. toMinutes (): 154
d. toMinutesPart (): 34
ISO 8601 формат:
PnYnMnDTnHnMnS
разумный стандарт ISO 8601 определяет краткое текстовое представление отрезка времени как количество лет, месяцев, дней, часов и т. д. Стандартные звонки такие, например, интервал а продолжительность. Формат
PnYnMnDTnHnMnS
здесьP
означает "периода",T
отделяет часть даты от части времени, а между ними находятся цифры, за которыми следует буква.примеры:
P3Y6M4DT12H30M5S
три года, шесть месяцев, четыре дня, двенадцать часов, тридцать минут и пять секундPT4H30M
четыре с половиной часыjava.время
The java.время фреймворк встроенный в Java 8 и позже вытесняет хлопотный старый
java.util.Date
/java.util.Calendar
классы. Новые классы вдохновлены очень успешным Joda Времени фреймворк, задуманный как его преемник, схож по концепции, но перестроен. Определяется JSR 310. Расширяется за счет ThreeTen-Extra. Смотрите учебник.момент
The
Instant
класс представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дробью).Instant instant = Instant.now() ; // Capture current moment in UTC.
лучше избегать устаревших классов, таких как
Date
/Calendar
. Но если вы должны взаимодействовать со старым кодом, который еще не обновлен до java.время, конвертировать туда и обратно. Вызов нового методы преобразования добавлены в старые классы. Для перехода отjava.util.Date
доInstant
, называютDate::toInstant
.Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
период времени
java.классы времени разделили эту идею представления промежутка времени как числа лет, месяцев, дней, часов, минут, секунд на две половины:
вот пример.
ZoneId zoneId = ZoneId.of ( "America/Montreal" ); ZonedDateTime now = ZonedDateTime.now ( zoneId ); ZonedDateTime future = now.plusMinutes ( 63 ); Duration duration = Duration.between ( now , future );
дамп в консоли.
и
Period
иDuration
использовать ISO 8601 стандарт для генерации строкового представления их значения.System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
сейчас: 2015-11-26T00: 46: 48.016-05: 00[Америка / Монреаль] в будущее: 2015-11-26T00: 46: 48.016-05: 00[Америка / Монреаль] = PT1H3M
Java 9 добавляет методы в
Duration
чтобы получить часть дней, часть часов, часть минут и часть секунд.вы можете получить общее количество дней или часов или минут или секунд или миллисекунд или наносекунд в течение всего времени.
long totalHours = duration.toHours();
в Java 9 the
Duration
класс получает новые методы для возврата различных частей дней, часов, минут, секунд, миллисекунд / наносекунд. Звоните вto…Part
методы:toDaysPart()
,toHoursPart()
и так далее.
ChronoUnit
если вы заботитесь только о более простой большей детализации времени, такой как" количество дней, прошедших", используйте
ChronoUnit
перечисление.long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
еще один пример.
Instant now = Instant.now(); Instant later = now.plus( Duration.ofHours( 2 ) ); … long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
о java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют хлопотные старый наследие классы даты и времени, такие как
java.util.Date
,Calendar
,&SimpleDateFormat
.The Joda Времени, теперь режим обслуживания, советует миграцию на java.время.
дополнительные сведения см. В разделе элемент Учебник Oracle. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
где получить java.время занятий?
- Java SE 8 и SE 9 и позже
- встроенный.
- часть стандартного Java API с комплектной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- большая часть java.функциональность time обратно портирована на Java 6 & 7 в ThreeTen-Backport.
- Android
- The ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше) специально для Android.
- посмотреть как использовать....
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как
Interval
,YearWeek
,YearQuarter
и больше.
Joda Времени
обновление: Элемент Joda Времени сейчас режим обслуживания, с командой, консультирующей миграцию в java.время классы. Я оставляю этот раздел нетронутым для истории.
библиотека Joda-Time использует ISO 8601 для своих значений по умолчанию. Его
Period
класс анализирует и генерирует эти строки PnYnMnDTnHnMnS.DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones. Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30)); System.out.println( "period: " + period );
выводит:
period: PT4H30M
немного более простая альтернатива:
System.currentTimeMillis() - oldDate.getTime()
Что касается "приятнее": Ну, что именно вам нужно? Проблема с представлением длительности времени в виде количества часов и дней и т. д. это может привести к неточностям и неправильным ожиданиям из-за сложности дат (например, дни могут иметь 23 или 25 часов из-за летнего времени).
использование миллисекундного подхода может вызвать проблемы в некоторых локалях.
возьмем, например, разницу между двумя датами 03/24/2007 и 03/25/2007 должен быть 1 день;
однако, используя миллисекундный маршрут, вы получите 0 дней, если вы запустите это в Великобритании!
/** Manual Method - YIELDS INCORRECT RESULTS - DO NOT USE**/ /* This method is used to find the no of days between the given dates */ public long calculateDays(Date dateEarly, Date dateLater) { return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000); }
лучший способ реализовать это-использовать java.утиль.Календарь
/** Using Calendar - THE CORRECT WAY**/ public static long daysBetween(Calendar startDate, Calendar endDate) { Calendar date = (Calendar) startDate.clone(); long daysBetween = 0; while (date.before(endDate)) { date.add(Calendar.DAY_OF_MONTH, 1); daysBetween++; } return daysBetween; }
есть много способов, вы можете найти разницу между датами и временем. Один из самых простых способов, который я знаю, будет:
Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); calendar1.set(2012, 04, 02); calendar2.set(2012, 04, 04); long milsecs1= calendar1.getTimeInMillis(); long milsecs2 = calendar2.getTimeInMillis(); long diff = milsecs2 - milsecs1; long dsecs = diff / 1000; long dminutes = diff / (60 * 1000); long dhours = diff / (60 * 60 * 1000); long ddays = diff / (24 * 60 * 60 * 1000); System.out.println("Your Day Difference="+ddays);
оператор печати-это просто пример - вы можете отформатировать его, как вам нравится.
поскольку все ответы здесь правильные, но используют устаревшие java или сторонние библиотеки, такие как joda или аналогичные, я просто отброшу другой способ, используя new java.время классы в Java 8 и выше. Смотрите Oracle Tutorial.
использовать
LocalDate
иChronoUnit
:LocalDate d1 = LocalDate.of(2017, 5, 1); LocalDate d2 = LocalDate.of(2017, 5, 18); long days = ChronoUnit.DAYS.between(d1, d2); System.out.println( days );
вычитание дат в миллисекундах работает (как описано в другом посте), но вы есть чтобы использовать HOUR_OF_DAY, а не час при очистке временных частей ваших дат:
public static final long MSPERDAY = 60 * 60 * 24 * 1000; ... final Calendar dateStartCal = Calendar.getInstance(); dateStartCal.setTime(dateStart); dateStartCal.set(Calendar.HOUR_OF_DAY, 0); // Crucial. dateStartCal.set(Calendar.MINUTE, 0); dateStartCal.set(Calendar.SECOND, 0); dateStartCal.set(Calendar.MILLISECOND, 0); final Calendar dateEndCal = Calendar.getInstance(); dateEndCal.setTime(dateEnd); dateEndCal.set(Calendar.HOUR_OF_DAY, 0); // Crucial. dateEndCal.set(Calendar.MINUTE, 0); dateEndCal.set(Calendar.SECOND, 0); dateEndCal.set(Calendar.MILLISECOND, 0); final long dateDifferenceInDays = ( dateStartCal.getTimeInMillis() - dateEndCal.getTimeInMillis() ) / MSPERDAY; if (dateDifferenceInDays > 15) { // Do something if difference > 15 days }
посмотри Джода Времени, который является улучшенным API даты/времени для Java и должен отлично работать с Scala.
Если вы не хотите использовать JodaTime или подобное, лучшее решение, вероятно, это:
final static long MILLIS_PER_DAY = 24 * 3600 * 1000; long msDiff= date1.getTime() - date2.getTime(); long daysDiff = Math.round(msDiff / ((double)MILLIS_PER_DAY));
количество МС в день не всегда одинаково (из-за летнего времени и прыжковых секунд), но это очень близко, и по крайней мере отклонения из-за летнего времени отменяются в течение более длительных периодов. Поэтому деление, а затем округление даст правильный результат (по крайней мере, до тех пор, пока используемый локальный календарь не содержит странных скачков времени, отличных от DST и leap считанные секунды.)
обратите внимание, что это все еще предполагает, что
date1
иdate2
устанавливаются в одно и то же время суток. Для разных времен суток вам сначала нужно определить, что означает "разница в дате", как указал Джон Скит.
позвольте мне показать разницу между интервалом Джоды и днями:
DateTime start = new DateTime(2012, 2, 6, 10, 44, 51, 0); DateTime end = new DateTime(2012, 2, 6, 11, 39, 47, 1); Interval interval = new Interval(start, end); Period period = interval.toPeriod(); System.out.println(period.getYears() + " years, " + period.getMonths() + " months, " + period.getWeeks() + " weeks, " + period.getDays() + " days"); System.out.println(period.getHours() + " hours, " + period.getMinutes() + " minutes, " + period.getSeconds() + " seconds "); //Result is: //0 years, 0 months, *1 weeks, 1 days* //0 hours, 54 minutes, 56 seconds //Period can set PeriodType,such as PeriodType.yearMonthDay(),PeriodType.yearDayTime()... Period p = new Period(start, end, PeriodType.yearMonthDayTime()); System.out.println(p.getYears() + " years, " + p.getMonths() + " months, " + p.getWeeks() + " weeks, " + p.getDays() + "days"); System.out.println(p.getHours() + " hours, " + p.getMinutes() + " minutes, " + p.getSeconds() + " seconds "); //Result is: //0 years, 0 months, *0 weeks, 8 days* //0 hours, 54 minutes, 56 seconds
Если вам нужна отформатированная строка возврата, например "2 дня 03h 42m 07s", попробуйте это:
public String fill2(int value) { String ret = String.valueOf(value); if (ret.length() < 2) ret = "0" + ret; return ret; } public String get_duration(Date date1, Date date2) { TimeUnit timeUnit = TimeUnit.SECONDS; long diffInMilli = date2.getTime() - date1.getTime(); long s = timeUnit.convert(diffInMilli, TimeUnit.MILLISECONDS); long days = s / (24 * 60 * 60); long rest = s - (days * 24 * 60 * 60); long hrs = rest / (60 * 60); long rest1 = rest - (hrs * 60 * 60); long min = rest1 / 60; long sec = s % 60; String dates = ""; if (days > 0) dates = days + " Days "; dates += fill2((int) hrs) + "h "; dates += fill2((int) min) + "m "; dates += fill2((int) sec) + "s "; return dates; }
Проверьте пример здесь http://www.roseindia.net/java/beginners/DateDifferent.shtml Этот пример дает вам разницу в днях, часах, минутах, секундах и миллисекундах :).
import java.util.Calendar; import java.util.Date; public class DateDifferent { public static void main(String[] args) { Date date1 = new Date(2009, 01, 10); Date date2 = new Date(2009, 07, 01); Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); calendar1.setTime(date1); calendar2.setTime(date2); long milliseconds1 = calendar1.getTimeInMillis(); long milliseconds2 = calendar2.getTimeInMillis(); long diff = milliseconds2 - milliseconds1; long diffSeconds = diff / 1000; long diffMinutes = diff / (60 * 1000); long diffHours = diff / (60 * 60 * 1000); long diffDays = diff / (24 * 60 * 60 * 1000); System.out.println("\nThe Date Different Example"); System.out.println("Time in milliseconds: " + diff + " milliseconds."); System.out.println("Time in seconds: " + diffSeconds + " seconds."); System.out.println("Time in minutes: " + diffMinutes + " minutes."); System.out.println("Time in hours: " + diffHours + " hours."); System.out.println("Time in days: " + diffDays + " days."); } }
используйте часовой пояс GMT, чтобы получить экземпляр календаря, установите время с помощью метода set класса Calendar. Часовой пояс GMT имеет смещение 0 (не очень важно) и флаг летнего времени, установленный в false.
final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); cal.set(Calendar.YEAR, 2011); cal.set(Calendar.MONTH, 9); cal.set(Calendar.DAY_OF_MONTH, 29); cal.set(Calendar.HOUR, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); final Date startDate = cal.getTime(); cal.set(Calendar.YEAR, 2011); cal.set(Calendar.MONTH, 12); cal.set(Calendar.DAY_OF_MONTH, 21); cal.set(Calendar.HOUR, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); final Date endDate = cal.getTime(); System.out.println((endDate.getTime() - startDate.getTime()) % (1000l * 60l * 60l * 24l));
следующий код может дать вам желаемый результат:
String startDate = "Jan 01 2015"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy"); LocalDate date = LocalDate.parse(startDate, formatter); String currentDate = "Feb 11 2015"; LocalDate date1 = LocalDate.parse(currentDate, formatter); System.out.println(date1.toEpochDay() - date.toEpochDay());
public static String getDifferenceBtwTime(Date dateTime) { long timeDifferenceMilliseconds = new Date().getTime() - dateTime.getTime(); long diffSeconds = timeDifferenceMilliseconds / 1000; long diffMinutes = timeDifferenceMilliseconds / (60 * 1000); long diffHours = timeDifferenceMilliseconds / (60 * 60 * 1000); long diffDays = timeDifferenceMilliseconds / (60 * 60 * 1000 * 24); long diffWeeks = timeDifferenceMilliseconds / (60 * 60 * 1000 * 24 * 7); long diffMonths = (long) (timeDifferenceMilliseconds / (60 * 60 * 1000 * 24 * 30.41666666)); long diffYears = (long)(timeDifferenceMilliseconds / (1000 * 60 * 60 * 24 * 365)); if (diffSeconds < 1) { return "one sec ago"; } else if (diffMinutes < 1) { return diffSeconds + " seconds ago"; } else if (diffHours < 1) { return diffMinutes + " minutes ago"; } else if (diffDays < 1) { return diffHours + " hours ago"; } else if (diffWeeks < 1) { return diffDays + " days ago"; } else if (diffMonths < 1) { return diffWeeks + " weeks ago"; } else if (diffYears < 12) { return diffMonths + " months ago"; } else { return diffYears + " years ago"; } }
лучше всего -
(Date1-Date2)/86 400 000
Это число является числом МС в день.
одна дата-другая дата дает вам разницу в миллисекундах.
соберите ответ в двойной переменной.
Это, вероятно, самый простой способ сделать это - возможно, это потому, что я уже некоторое время кодирую на Java (с его, по общему признанию, неуклюжими библиотеками даты и времени), но этот код выглядит "простым и приятным" для меня!
вы довольны результатом, возвращаемым в миллисекундах, или это часть вашего вопроса, Что вы предпочли бы, чтобы он вернулся в каком-то альтернативном формате?
не используя стандартный API, нет. Вы можете свернуть свой собственный делать что-то вроде этого:
class Duration { private final TimeUnit unit; private final long length; // ... }
или вы можете использовать Джода:
DateTime a = ..., b = ...; Duration d = new Duration(a, b);
Примечание: startDate и endDates - > java.утиль.Дата
import org.joda.time.Duration; import org.joda.time.Interval; Interval interval = new Interval(startDate.getTime(), endDate.getTime); Duration period = interval.toDuration(); period.getStandardDays() //gives the number of days elapsed between start and end date
Как и дни, вы также можете получить часы, минуты и секунды
period.getStandardHours(); period.getStandardMinutes(); period.getStandardSeconds();
просто ответить на первоначальный вопрос:
поместите следующий код в функцию Long getAge () {}
Date dahora = new Date(); long MillisToYearsByDiv = 1000l *60l * 60l * 24l * 365l; long javaOffsetInMillis = 1990l * MillisToYearsByDiv; long realNowInMillis = dahora.getTime() + javaOffsetInMillis; long realBirthDayInMillis = this.getFechaNac().getTime() + javaOffsetInMillis; long ageInMillis = realNowInMillis - realBirthDayInMillis; return ageInMillis / MillisToYearsByDiv;
наиболее важным здесь является работа с длинными числами при умножении и делении. И, конечно же, смещение, которое Java применяет в своем исчислении дат.
:)
Так как вопрос помечен Scala,
import scala.concurrent.duration._ val diff = (System.currentTimeMillis() - oldDate.getTime).milliseconds val diffSeconds = diff.toSeconds val diffMinutes = diff.toMinutes val diffHours = diff.toHours val diffDays = diff.toDays
вот правильное решение Java 7 в O (1) без каких-либо зависимостей.
public static int countDaysBetween(Date date1, Date date2) { Calendar c1 = removeTime(from(date1)); Calendar c2 = removeTime(from(date2)); if (c1.get(YEAR) == c2.get(YEAR)) { return Math.abs(c1.get(DAY_OF_YEAR) - c2.get(DAY_OF_YEAR)) + 1; } // ensure c1 <= c2 if (c1.get(YEAR) > c2.get(YEAR)) { Calendar c = c1; c1 = c2; c2 = c; } int y1 = c1.get(YEAR); int y2 = c2.get(YEAR); int d1 = c1.get(DAY_OF_YEAR); int d2 = c2.get(DAY_OF_YEAR); return d2 + ((y2 - y1) * 365) - d1 + countLeapYearsBetween(y1, y2) + 1; } private static int countLeapYearsBetween(int y1, int y2) { if (y1 < 1 || y2 < 1) { throw new IllegalArgumentException("Year must be > 0."); } // ensure y1 <= y2 if (y1 > y2) { int i = y1; y1 = y2; y2 = i; } int diff = 0; int firstDivisibleBy4 = y1; if (firstDivisibleBy4 % 4 != 0) { firstDivisibleBy4 += 4 - (y1 % 4); } diff = y2 - firstDivisibleBy4 - 1; int divisibleBy4 = diff < 0 ? 0 : diff / 4 + 1; int firstDivisibleBy100 = y1; if (firstDivisibleBy100 % 100 != 0) { firstDivisibleBy100 += 100 - (firstDivisibleBy100 % 100); } diff = y2 - firstDivisibleBy100 - 1; int divisibleBy100 = diff < 0 ? 0 : diff / 100 + 1; int firstDivisibleBy400 = y1; if (firstDivisibleBy400 % 400 != 0) { firstDivisibleBy400 += 400 - (y1 % 400); } diff = y2 - firstDivisibleBy400 - 1; int divisibleBy400 = diff < 0 ? 0 : diff / 400 + 1; return divisibleBy4 - divisibleBy100 + divisibleBy400; } public static Calendar from(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); return c; } public static Calendar removeTime(Calendar c) { c.set(HOUR_OF_DAY, 0); c.set(MINUTE, 0); c.set(SECOND, 0); c.set(MILLISECOND, 0); return c; }
попробуйте это:
int epoch = (int) (new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 00:00:00").getTime() / 1000);
вы можете редактировать строку в Parse () методы param.
Так как вы используете Scala, есть очень хорошая библиотека Scala Ламма. С Lamma вы можете минус дата непосредственно с
-
операторscala> Date(2015, 5, 5) - 2 // minus days by int res1: io.lamma.Date = Date(2015,5,3) scala> Date(2015, 5, 15) - Date(2015, 5, 8) // minus two days => difference between two days res2: Int = 7