Как узнать разницу во времени, например у меня дана дата в секундах (Unix время)
и мне нужно перевести текущее время в (Unix)
и узнать разницу в секундах.
Как мне сделать это?
задан 17 авг 2015 в 18:26
Denis KotlyarovDenis Kotlyarov
2,8563 золотых знака25 серебряных знаков53 бронзовых знака
3
Date oldDate = new Date(1322018752992l); //старое время в миллисекундах
Date newDate = new Date(); //текущее время
long seconds = (newDate.getTime()-oldDate.getTime())/1000; //возвращаем в секундах разницу
ответ дан 17 авг 2015 в 20:50
1
Текущее время можно получить с помощью System.currentTimeMillis()
– получите в милисекундах. Потом просто на 1000 поделить и будет в секундах.
ответ дан 17 авг 2015 в 19:03
anberanber
4,33513 серебряных знаков22 бронзовых знака
Если я корректно понял – нужна разница в секундах между текущим временем и заданным в виде unix epoch(секунды прошедшие с 01.01.1970)
Можно использовать следующий код:
Long date = new Date(12321413l).getTime(); // заданная дата в Unix-epoch в мс
Long currentDate = new Date().getTime(); // текущая дата в Unix-epoch в мс
Long result = (currentDate - date)/1000; //разница в секундах между текущим временем и заданным
System.out.println(result);
ответ дан 17 авг 2015 в 19:21
NektoDevNektoDev
3251 серебряный знак9 бронзовых знаков
In my previous article, I wrote about adding days to an instance of a date in Java. In this article, you will learn how to calculate the duration between two dates using Java 8 new date and time API and the legacy Date
API.
Java 8 Date & Time API
Java 8 introduced a whole new date and time API (classes in the java.time.*
package) to fix the shortcomings of the legacy Date
and Calendar
API. The new API provides several utility methods for date and time manipulations. You can use utility classes like Period
, Duration
, and ChronoUnit
to calculate the difference between two instances of the new date and time API class.
Days between two LocalDate
objects
The LocalDate
class presents the date without time in ISO-8601 format (yyyy-MM-dd
). Unlike the legacy Date
class, it doesn’t store any timezone information.
The following example demonstrates how you can use the Duration
class to calculate the number of days between two LocalDate
instances:
// create date instances
LocalDate localDate1 = LocalDate.parse("2019-12-31");
LocalDate localDate2 = LocalDate.parse("2020-01-08");
// calculate difference
long days = Duration.between(localDate1.atStartOfDay(), localDate2.atStartOfDay()).toDays();
// print days
System.out.println("Days between " + localDate1 + " and " + localDate2 + ": " + days);
Here is the output of the above code snippet:
Days between 2019-12-31 and 2020-01-08: 8
The new date and time API also provides ChronoUnit
enum class to represent individual date-time units such as days, months, years, hours, seconds, etc.
Each unit provides an implementation for a method called between()
to calculate the amount of time between two temporal objects for that specific unit.
Let us look at the below example that calculates the days and months between two LocalDate
instances using ChronoUnit
:
// create date instances
LocalDate pastDate = LocalDate.of(2019, Month.AUGUST, 15);
LocalDate now = LocalDate.now();
// calculate difference
long months = ChronoUnit.MONTHS.between(pastDate, now);
long days = ChronoUnit.DAYS.between(pastDate, now);
// print days & months
System.out.println("Months between " + pastDate + " and " + now + ": " + months);
System.out.println("Days between " + pastDate + " and " + now + ": " + days);
The above code snippet will output the following:
Months between 2019-08-15 and 2020-01-10: 4
Days between 2019-08-15 and 2020-01-10: 148
Hours between two LocalTime
objects
A LocalTime
represents time without date in ISO-8601 format (HH:mm:ss.SSS
). To calculate the difference between two instances of LocalTime
, you need to use the Duration
class that represents the duration between two times.
Here is an example:
// create time instances
LocalTime firstTime = LocalTime.of(11, 30);
LocalTime secondTime = LocalTime.of(22, 35);
// calculate the difference between times
Duration duration = Duration.between(firstTime, secondTime);
// print the difference
System.out.println("Hours between " + firstTime + " and " + secondTime + ": " + duration.toHours());
System.out.println("Minutes between " + firstTime + " and " + secondTime + ": " + duration.toMinutes());
The above example will print the following on the console:
Hours between 11:30 and 22:35: 11
Minutes between 11:30 and 22:35: 665
Alternatively, you can also use ChronoUnit
to calculate the difference between two LocalDate
in terms of specific time units as shown below:
// create time instances
LocalTime firstTime = LocalTime.of(10, 15, 45);
LocalTime secondTime = LocalTime.of(14, 50, 15);
// calculate the difference between times
long hours = ChronoUnit.HOURS.between(firstTime, secondTime);
long minutes = ChronoUnit.MINUTES.between(firstTime, secondTime);
long seconds = ChronoUnit.SECONDS.between(firstTime, secondTime);
// print the difference
System.out.println("Hours between " + firstTime + " and " + secondTime + ": " + hours);
System.out.println("Minutes between " + firstTime + " and " + secondTime + ": " + minutes);
System.out.println("Seconds between " + firstTime + " and " + secondTime + ": " + seconds);
Here is what the output looks like:
Hours between 10:15:45 and 14:50:15: 4
Minutes between 10:15:45 and 14:50:15: 274
Seconds between 10:15:45 and 14:50:15: 16470
Days between two LocalDateTime
objects
The LocalDateTime
class represents both date and time without timezone in ISO-8601 format (yyyy-MM-ddTHH:mm:ss.SSS
). The following example demonstrates how you can calculate the difference between two LocalDateTime
instances of terms of days using Duration
:
// create date time instances
LocalDateTime dateTime1 = LocalDateTime.parse("2018-08-02T15:14");
LocalDateTime dateTime2 = LocalDateTime.parse("2019-02-14T12:45");
// calculate difference
Duration duration = Duration.between(dateTime1, dateTime2);
// print the difference
System.out.println("Days between " + dateTime1 + " and " + dateTime2 + ": " + duration.toDays());
System.out.println("Hours between " + dateTime1 + " and " + dateTime2 + ": " + duration.toHours());
The above example will output the following:
Days between 2018-08-02T15:14 and 2019-02-14T12:45: 195
Hours between 2018-08-02T15:14 and 2019-02-14T12:45: 4701
Let us look at another example that uses ChronoUnit
to find out the difference between two LocalDateTime
objects:
// create date time instances
LocalDateTime pastDateTime = LocalDateTime.of(2019, Month.NOVEMBER, 12, 10, 40);
LocalDateTime now = LocalDateTime.now();
// calculate difference
long months = ChronoUnit.MONTHS.between(pastDateTime, now);
long days = ChronoUnit.DAYS.between(pastDateTime, now);
// print days & months
System.out.println("Months between " + pastDateTime + " and " + now + ": " + months);
System.out.println("Days between " + pastDateTime + " and " + now + ": " + days);
You should see the following output when you execute the above example:
Months between 2019-11-12T10:40 and 2020-01-10T18:36:48.356: 1
Days between 2019-11-12T10:40 and 2020-01-10T18:36:48.356: 59
Days between two ZonedDateTime
objects
A ZonedDateTime
represents a date and time with a timezone in ISO-8601 format (e.g 2019-05-15T10:15:30+01:00[Europe/Paris]
). It deals with timezone-specific dates and times in Java 8 and higher.
Here is an example that shows how you can measure the difference between two ZonedDateTime
instances:
// create date time instances
ZonedDateTime dateTime1 = ZonedDateTime.parse("2019-05-15T10:15:30+01:00[Europe/Paris]");
ZonedDateTime dateTime2 = ZonedDateTime.parse("2020-01-05T12:00:33+05:00[Asia/Karachi]");
// calculate difference
Duration duration = Duration.between(dateTime1, dateTime2);
// print the difference
System.out.println("Days between " + dateTime1 + " and " + dateTime2 + ": " + duration.toDays());
System.out.println("Hours between " + dateTime1 + " and " + dateTime2 + ": " + duration.toHours());
As you can see above, we have created two ZonedDateTime
instances in different time zones. The great thing about the new date and time API is that it will automatically calculate the timezone differences, as shown in the below output:
Days between 2019-05-15T10:15:30+02:00[Europe/Paris] and 2020-01-05T12:00:33+05:00[Asia/Karachi]: 234
Hours between 2019-05-15T10:15:30+02:00[Europe/Paris] and 2020-01-05T12:00:33+05:00[Asia/Karachi]: 5638
The same date and time difference calculations can be performed through the ChronoUnit
enum class as shown below:
// create date time instances
ZonedDateTime pastDateTime = ZonedDateTime.of(2018,2, 18, 10, 30, 0, 0, ZoneId.of("Europe/Paris"));
ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());
// calculate difference
long months = ChronoUnit.MONTHS.between(pastDateTime, now);
long days = ChronoUnit.DAYS.between(pastDateTime, now);
// print days & months
System.out.println("Months between " + pastDateTime + " and " + now + ": " + months);
System.out.println("Days between " + pastDateTime + " and " + now + ": " + days);
Here is the output for the above example:
Months between 2018-02-18T10:30+01:00[Europe/Paris] and 2020-01-10T18:48:38.368+05:00[Asia/Karachi]: 22
Days between 2018-02-18T10:30+01:00[Europe/Paris] and 2020-01-10T18:48:38.368+05:00[Asia/Karachi]: 691
Days between two OffsetDateTime
objects
Finally, the last new date and time API class we’ll discuss is OffsetDateTime
. It represents a date and time with an offset from UTC/Greenwich in the ISO-8601 format (e.g., 2018-12-30T23:15:30+03:30
).
The following example shows how you can measure the difference between two OffsetDateTime
instances:
// create date time instances
OffsetDateTime dateTime1 = OffsetDateTime.parse("2018-12-30T23:15:30+03:30");
OffsetDateTime dateTime2 = OffsetDateTime.parse("2019-07-17T05:15:30-05:00");
// calculate difference
Duration duration = Duration.between(dateTime1, dateTime2);
// print the difference
System.out.println("Days between " + dateTime1 + " and " + dateTime2 + ": " + duration.toDays());
System.out.println("Hours between " + dateTime1 + " and " + dateTime2 + ": " + duration.toHours());
The above example will output the following:
Days between 2018-12-30T23:15:30+03:30 and 2019-07-17T05:15:30-05:00: 198
Hours between 2018-12-30T23:15:30+03:30 and 2019-07-17T05:15:30-05:00: 4766
Another way to find out the difference between two OffsetDateTime
is using the ChronoUnit
enum class:
// create date time instances
OffsetDateTime pastDateTime = OffsetDateTime.of(2019, 8, 25, 15, 40, 0, 0, ZoneOffset.of("+03:00"));
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.systemDefault());
// calculate difference
long months = ChronoUnit.MONTHS.between(pastDateTime, now);
long days = ChronoUnit.DAYS.between(pastDateTime, now);
// print days & months
System.out.println("Months between " + pastDateTime + " and " + now + ": " + months);
System.out.println("Days between " + pastDateTime + " and " + now + ": " + days);
Here is the output of the above code snippet:
Months between 2019-08-25T15:40+03:00 and 2020-01-10T18:56:30.484+05:00: 4
Days between 2019-08-25T15:40+03:00 and 2020-01-10T18:56:30.484+05:00: 138
Check out Introduction to Java 8 Date and Time API tutorial for more new date and time API examples.
Days between two Date
& Calendar
objects
Before Java 8, java.util.Date
and java.util.Calendar
classes were used for handling dates and times. These old classes have many flaws that were fixed with the release of the new date and time API in Java 8. Since these classes are still actively used in old projects, it is worth knowing how to calculate the difference between two Date
objects.
The following example demonstrates how you can parse strings to create two instances of Date
and then find the difference between them in milliseconds. Later, we convert the milliseconds into days and print the result on the console:
// date pattern
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
// parse string to date
Date dateBefore = formatter.parse("2019-12-05");
Date dateAfter = formatter.parse("2020-01-05");
// calculate difference in milliseconds
long ms = Math.abs(dateAfter.getTime() - dateBefore.getTime());
// convert milliseconds to days
long days = TimeUnit.DAYS.convert(ms, TimeUnit.MILLISECONDS);
// print days
System.out.println("Days Between Dates: " + days);
The above program will output the following:
Days Between Dates: 31
Conclusion
In this article, we looked at different ways to calculate the difference between two dates in Java. We discussed Java 8 new date and time API classes that provide utility methods to calculate the number of days between the given date and time instances.
The new date and time API introduced in Java 8 provides a wide range of classes that have simplified working with dates and times.
Read next: How to get current date and time in Java
✌️ Like this article? Follow me on
Twitter
and LinkedIn.
You can also subscribe to
RSS Feed.
Сегодня мы научимся находить разницу между 2 датами. Эта статья является продолжением раздела Java для начинающих. В этой статье мы научимся определять разницу между двумя датами в Java.
Для этого давайте вспомним как происходит преобразование даты из миллисекунд в секунды/минуты/часы/дни:
- 1000 миллисекунд = 1 секунда
- 60 000 миллисекунд = 60 секунд = 1 минута
- 3 600 секунд = 60 минут = 1 час
- 24 часа = 1 440 минут = 1 день
Теперь просто перенесем преобразования в пример на Java.
Как найти разницу между датами в Java?
На листинге ниже мы создаем 2 объекта Date
в определенном формате и получаем значения каждой даты в миллисекундах с помощью метода getTime()
и дальше проводим преобразования, представленные выше:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package ua.com.prologistic; import java.text.SimpleDateFormat; import java.util.Date; public class DifferenceBtwTwoDates { public static void main(String[] args) { try { // создаем формат, в котором будем парсить дату SimpleDateFormat dateFormat = new SimpleDateFormat(“dd.MM.yyyy”); Date date1 = dateFormat.parse(“15.05.2018”); Date date2 = dateFormat.parse(“17.05.2018”); System.out.println(“Первая дата: “ + date1); System.out.println(“Вторая дата: “ + date2); long milliseconds = date2.getTime() – date1.getTime(); System.out.println(“nРазница между датами в миллисекундах: “ + milliseconds); // 1000 миллисекунд = 1 секунда int seconds = (int) (milliseconds / (1000)); System.out.println(“Разница между датами в секундах: “ + seconds); // 60 000 миллисекунд = 60 секунд = 1 минута int minutes = (int) (milliseconds / (60 * 1000)); System.out.println(“Разница между датами в минутах: “ + minutes); // 3 600 секунд = 60 минут = 1 час int hours = (int) (milliseconds / (60 * 60 * 1000)); System.out.println(“Разница между датами в часах: “ + hours); // 24 часа = 1 440 минут = 1 день int days = (int) (milliseconds / (24 * 60 * 60 * 1000)); System.out.println(“Разница между датами в днях: “ + days); } catch (Exception e) { e.printStackTrace(); } } } |
Теперь запустим программу и смотрим в консоль:
Первая дата: Tue May 15 00:00:00 EEST 2018 Вторая дата: Thu May 17 00:00:00 EEST 2018 Разница между датами в миллисекундах: 172800000 Разница между датами в секундах: 172800 Разница между датами в минутах: 2880 Разница между датами в часах: 48 Разница между датами в днях: 2 |
Обратите внимание, что в листинге мы явно отнимаем меньшую дату от большей. Если наоборот отнять большую дату от меньшей, то в результате получим такой же результат, но со знаком минус.
Подписывайтесь на новые статьи по Java и Android.
2.1. Использованиеjava.util.Date для определения разницы в днях
Давайте начнем с использования основных API-интерфейсов Java для расчета и определения количества дней между двумя датами:
@Test
public void givenTwoDatesBeforeJava8_whenDifferentiating_thenWeGetSix()
throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
Date firstDate = sdf.parse("06/24/2017");
Date secondDate = sdf.parse("06/30/2017");
long diffInMillies = Math.abs(secondDate.getTime() - firstDate.getTime());
long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
assertEquals(diff, 6);
}
2.2. Использованиеjava.time – начиная с Java 8
Теперь вычисление разницы станет более интуитивным, если мы используемLocalDate, LocalDateTime для представления двух дат (со временем или без него) в сочетании сPeriod иDuration:.
РазницаLocalDate:
@Test
public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() {
LocalDate now = LocalDate.now();
LocalDate sixDaysBehind = now.minusDays(6);
Period period = Period.between(now, sixDaysBehind);
int diff = period.getDays();
assertEquals(diff, 6);
}
СлучайLocalDateTime:
@Test
public void givenTwoDateTimesInJava8_whenDifferentiating_thenWeGetSix() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime sixMinutesBehind = now.minusMinutes(6);
Duration duration = Duration.between(now, sixMinutesBehind);
long diff = Math.abs(duration.toMinutes());
assertEquals(diff, 6);
}
Here ‘немного подробнее об этом API.
2.3. Использованиеjava.time.temporal.ChronoUnit для определения разницы в секундах
API времени в Java 8 представляет собой единицу даты и времени, например секунды или дни, используяTemporalUnit interface. Each unit provides an implementation for a method named between to calculate the amount of time between two temporal objects in terms of that specific unit.
Например, чтобы вычислить секунды между двумяLocalDateTimes:
@Test
public void givenTwoDateTimesInJava8_whenDifferentiatingInSeconds_thenWeGetTen() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime tenSecondsLater = now.plusSeconds(10);
long diff = ChronoUnit.SECONDS.between(now, tenSecondsLater);
assertEquals(diff, 10);
}
ChronoUnit предоставляет набор конкретных единиц времени, реализуя интерфейсTemporalUnit. It’s highly recommended to static import the ChronoUnit enum values to achieve more readability:
import static java.time.temporal.ChronoUnit.SECONDS;
// omitted
long diff = SECONDS.between(now, tenSecondsLater);
Кроме того, мы можем передать любые два совместимых временных объекта методуbetween , дажеZonedDateTime.
Что замечательно вZonedDateTime, так это то, что расчет будет работать, даже если они установлены в разные часовые пояса:
@Test
public void givenTwoZonedDateTimesInJava8_whenDifferentiating_thenWeGetSix() {
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime now = ldt.atZone(ZoneId.of("America/Montreal"));
ZonedDateTime sixMinutesBehind = now
.withZoneSameInstant(ZoneId.of("Asia/Singapore"))
.minusMinutes(6);
long diff = ChronoUnit.MINUTES.between(sixMinutesBehind, now);
assertEquals(diff, 6);
}
2.4. Используяjava.time.temporal.Temporaluntil()
Любой объектTemporal, например LocalDate or ZonedDateTime, provides an until method to calculate the amount of time until another temporal in terms of the specified unit:
@Test
public void givenTwoDateTimesInJava8_whenDifferentiatingInSecondsUsingUntil_thenWeGetTen() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime tenSecondsLater = now.plusSeconds(10);
long diff = now.until(tenSecondsLater, ChronoUnit.SECONDS);
assertEquals(diff, 10);
}
Temporal#until иTemporalUnit#between – это два разных API для одной и той же функциональности.
В этом посте мы обсудим, как рассчитать разницу между двумя датами в Java.
1. Использование TimeUnit.convert()
метод
Идея состоит в том, чтобы сначала получить разницу между двумя датами в миллисекундах, используя Date.getTime()
метод. Тогда мы можем использовать convert()
метод из java.util.concurrent.TimeUnit
enum для преобразования заданной продолжительности времени в данной единице измерения в единицу измерения аргумента.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; class Main { public static void main(String[] args) { String d1 = “10-20-2016”; String d2 = “10-19-2016”; String pattern = “MM-dd-yyyy”; SimpleDateFormat sdf = new SimpleDateFormat(pattern); try { Date date1 = sdf.parse(d1); Date date2 = sdf.parse(d2); // получаем разницу между двумя датами в минутах long elapsedms = date1.getTime() – date2.getTime(); long diff = TimeUnit.MINUTES.convert(elapsedms, TimeUnit.MILLISECONDS); System.out.println(diff); } catch (ParseException e) { e.printStackTrace(); } } } |
Скачать Выполнить код
результат:
1440
Обратите внимание, что приведенный выше фрагмент кода не учитывает часовые пояса как java.util.Date
всегда в UTC
. Кроме того, это не будет учитывать переход на летнее время.
2. Использование java.time
упаковка
Начиная с Java 8, мы должны использовать java.time
пакет, который предлагает множество улучшений по сравнению с существующим API даты и времени Java. Вот как мы можем вычислить разницу между двумя датами как Duration
в Java 8 и выше.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.time.Duration; import java.time.ZonedDateTime; class Main { public static void main(String[] args) { ZonedDateTime now = ZonedDateTime.now(); ZonedDateTime then = now.minusMonths(2).minusDays(10) .minusMinutes(5).minusSeconds(40); Duration duration = Duration.between(then, now); System.out.println(duration); // System.out.println(duration.getSeconds()); // System.out.println(duration.toMinutes()); // System.out.println(duration.toHours()); // System.out.println(duration.toDays()); } } |
Скачать Выполнить код
результат:
PT1704H5M40S
Если у тебя есть java.util.Date
объект, вы должны преобразовать его в java.time.Instant
а затем вычислить прошедшее время как продолжительность.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Duration; import java.time.Instant; import java.util.Date; class Main { public static void main(String[] args) { String d = “12/25/2018”; SimpleDateFormat sdf = new SimpleDateFormat(“MM/dd/yyyy”); try { Date date = sdf.parse(d); Duration duration = Duration.between(date.toInstant(), Instant.now()); System.out.println(duration); } catch (ParseException e) { e.printStackTrace(); } } } |
Скачать Выполнить код
результат:
PT3880H26M38.942S
3. Использование времени Джода
До Java 8 многие Java-проекты использовали Библиотека Joda-Time для даты и Time
классы. Это связано с тем, что стандартные классы даты и времени до Java 8 были плохими. Но с введением java.time
пакет в Java SE 8, команда Joda-Time попросила своих пользователей перейти на java.time
(JSR-310).
Если вы используете библиотеку Joda-Time в своем проекте и просто хотите узнать общее количество полных дней между двумя датами, вы можете использовать новый Days
класс в версии 1.4 Joda-Time.
Days d = Days.daysBetween(startDate, endDate); int days = d.getDays(); |
Если вы хотите рассчитать общее количество дней, недель, месяцев и лет между двумя датами, вам понадобится Period
. По умолчанию разница между двумя датами и временем будет разделена на части, например “1 месяц, 2 недели, 4 дня и 7 часов”.
Period p = new Period(startDate, endDate); |
Вы можете контролировать, какие поля будут извлечены с помощью PeriodType
.
Period p = new Period(startDate, endDate, PeriodType.yearMonthDay()); |
В этом примере не будут возвращены поля недель или времени; таким образом, предыдущий пример становится “1 месяц и 18 дней”.
Это все о вычислении разницы между двумя датами в Java.