Java 8 ZoneDateTime время получения - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь обновить этот код, чтобы использовать Java 8 раз API

  Calendar c = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC"));
    c.set(2020, 6 - 1, 7, 0, 0, 0);
    Date dts = c.getTime();
    // this time is already initialised to 01:00 BST
    int hours = 24;
    int minutes= 9;
    int seconds=0;

    Calendar calendar = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC"));
    calendar.setTime(dts);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, minutes);
    calendar.set(Calendar.SECOND, seconds);
    calendar.add(Calendar.HOUR_OF_DAY, hours);

    System.out.println(calendar.getTime());
    // Mon Jun 08 01:09:00 BST 2020

до чего-то подобного инициализация в 1 час. Вот где у меня трудности.

ZonedDateTime также не занимает часов больше 23, поэтому я должен уменьшить его на 1.

Я предполагаю, что вопрос, который я задаю, - каковы альтернативы java к методам в григорианском каландре, которые могут проявлять подобное поведение.

Ответы [ 3 ]

1 голос
/ 01 марта 2020

В дополнение к ответу Хуатсу используйте plusHours вместо withHour и используйте его с вашим местным часовым поясом и строкой формата:

ZonedDateTime zdt = ZonedDateTime.of(2020, 6, 7, 0, 0, 0, 0, ZoneId.of("UTC"));
int hours = 24;
int minutes = 9;
int seconds = 0;

zdt = zdt.plusHours(hours);
zdt = zdt.withMinute(minutes);
zdt = zdt.plusSeconds(seconds);

System.out.println(zdt
        .withZoneSameInstant(ZoneId.systemDefault())
        .format(DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss z uuuu")));

Или явно для получения "BST "где угодно:

System.out.println(zdt
        .withZoneSameInstant(ZoneId.of("Europe/London"))
        .format(DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss z uuuu")));
1 голос
/ 01 марта 2020

Оказывается, то, что мне было нужно, было похоже на это

 ZonedDateTime zdt = ZonedDateTime.ofInstant(date.toInstant(),ZoneId.of("UTC")).withHour(0).withMinute(minutes)
        .withSecond(seconds).plusHours(hours);

result = zdt.withZoneSameInstant(ZoneId.of("Europe/London"))

Спасибо всем за помощь в достижении этой точки.

1 голос
/ 01 марта 2020

Экземпляры LocalTime, LocalDate, LocalDateTime и ZonedDateTime являются неизменяемыми. Как и в случае со строками, вы должны переопределять ссылку на объект новым экземпляром каждый раз, когда вносите изменения:

   ZonedDateTime zdt = ZonedDateTime.of(2020,6,7,0,0,0,0,ZoneId.of("UTC"));

   zdt = zdt.withHour(hours-1);
   zdt = zdt.withMinute(minutes);
   zdt = zdt.plusSeconds(seconds);
   System.out.println(zdt);

Если вы новичок в этом API, я бы порекомендовал вам не используйте Zoned классы, если это не является абсолютно необходимым, так как они очень подвержены ошибкам.

...