ZonedDateTime от java.time
Я думаю, что элегантное решение использует java.time, современный Java-интерфейс даты и времени. Вы можете думать об этом как о преемнике библиотеки Joda-Time, которую вы использовали. Нам нужен класс ZonedDateTime
из java.time.
ZoneId zone = ZoneId.of("America/Los_Angeles");
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
String date1 = "Wed Oct 23 11:30:00 GMT 2019";
String date2 = "Mon Nov 04 12:30:00 GMT 2019";
ZonedDateTime startDateTime = ZonedDateTime.parse(date1, formatter)
.withZoneSameInstant(zone);
ZonedDateTime endDateTime = ZonedDateTime.parse(date2, formatter)
.withZoneSameInstant(zone);
while (! startDateTime.isAfter(endDateTime)) {
Instant gmt = startDateTime.toInstant();
System.out.println(startDateTime + " GMT: " + gmt);
startDateTime = startDateTime.plusDays(1);
}
Вывод этого фрагмента:
2019-10-23T04:30-07:00[America/Los_Angeles] GMT: 2019-10-23T11:30:00Z
2019-10-24T04:30-07:00[America/Los_Angeles] GMT: 2019-10-24T11:30:00Z
2019-10-25T04:30-07:00[America/Los_Angeles] GMT: 2019-10-25T11:30:00Z
… (cut) …
2019-11-01T04:30-07:00[America/Los_Angeles] GMT: 2019-11-01T11:30:00Z
2019-11-02T04:30-07:00[America/Los_Angeles] GMT: 2019-11-02T11:30:00Z
2019-11-03T04:30-08:00[America/Los_Angeles] GMT: 2019-11-03T12:30:00Z
2019-11-04T04:30-08:00[America/Los_Angeles] GMT: 2019-11-04T12:30:00Z
Вы видите, что время GMTизмените с 11:30 до 12:30 с 3 ноября.
Если вы хотите, чтобы вывод был отформатирован, как в вашем вопросе:
ZoneId gmtZone = ZoneId.of("Etc/GMT");
while (! startDateTime.isAfter(endDateTime)) {
ZonedDateTime gmtTime = startDateTime.withZoneSameInstant(gmtZone);
System.out.println(gmtTime.format(formatter));
startDateTime = startDateTime.plusDays(1);
}
Wed Oct 23 11:30:00 GMT 2019
Thu Oct 24 11:30:00 GMT 2019
… (cut) …
Sun Nov 03 12:30:00 GMT 2019
Mon Nov 04 12:30:00 GMT 2019
Joda-Time
Я не решаюсь представить решение Joda-Time по двум причинам. Во-первых, проект Joda-Time находится в режиме обслуживания, и для нового кода вы должны предпочесть java.time. Во-вторых, я не очень разбираюсь в Joda-Time, поэтому моё решение может быть не самым элегантным из возможных. Я не нашел Joda-Time эквивалента ZonedDateTime
, поэтому я использую его LocalDateTime
, который требует еще нескольких преобразований и является более хрупким, поскольку объект datetime не знает своего часового пояса.
DateTimeZone.setDefault(DateTimeZone.forID("Etc/GMT"));
DateTimeZone zone = DateTimeZone.forID("America/Los_Angeles");
DateTimeZone gmtZone = DateTimeZone.forID("Etc/GMT");
DateTimeFormatter formatter
= DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss zzz yyyy")
.withLocale(Locale.ROOT);
String date1 = "Wed Oct 23 11:30:00 GMT 2019";
String date2 = "Mon Nov 04 12:30:00 GMT 2019";
LocalDateTime sDate = formatter.parseDateTime(date1)
.withZone(zone)
.toLocalDateTime();
LocalDateTime eDate = formatter.parseDateTime(date2)
.withZone(zone)
.toLocalDateTime();
while(eDate.isAfter(sDate) || eDate.equals(sDate)) {
DateTime finaldate = sDate.toDateTime(zone).withZone(gmtZone);
System.out.println(finaldate.toString(formatter));
sDate = sDate.plusDays(1);
}
Wed Oct 23 11:30:00 GMT 2019
Thu Oct 24 11:30:00 GMT 2019
… (cut) …
Sat Nov 02 11:30:00 GMT 2019
Sun Nov 03 12:30:00 GMT 2019
Mon Nov 04 12:30:00 GMT 2019
При любых обстоятельствах избегайте плохо спроектированных и давно устаревших классов Date
и SimpleDateFormat
. Единственное исключение - если вам нужен устаревший объект Date
для устаревшего API, который вы не можете позволить себе обновить прямо сейчас. В этом случае преобразуйте непосредственно перед вызовом в этот устаревший API.
Ссылка