Как получить DayOfWeek из Instant.now()

Предполагая следующий код...

Instant x = Instant.now();

Как получить день недели из x?

Связанный stackoverflow.com/questions/33353190/…

Naman 29.05.2019 17:53

Instant — это абсолютное значение времени, день недели будет зависеть от того, где вы находитесь на Земле.

Jim Garrison 29.05.2019 18:14

@JimGarrison - насколько я понимаю, любой экземпляр Instant предполагается Zulu или UTC, что подразумевает Гринвич. Не могли бы мы вывести из этого день недели?

barrypicker 29.05.2019 18:17

Нет, как упоминает @techtabu в своем ответе, вы должны явно указать часовой пояс.

Jim Garrison 29.05.2019 18:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
4
9 450
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы должны преобразовать его в ZonedDateTime

Instant.now().atZone(ZoneId.systemDefault()).getDayOfWeek()
atZone(ZoneId.of("UTC")) с большей вероятностью даст желаемый результат.
Oleg 29.05.2019 17:58

@Олег - спасибо. Вы правы, мне не нужно местное время, поэтому я использую Instant.

barrypicker 29.05.2019 18:19

OffsetDateTime достаточно и в случае UTC имеет больше смысла. Также @Олег

Ole V.V. 29.05.2019 18:54

@Олег, неужели там нужно использовать строку? Неужели нет констант? :\

t3chb0t 17.01.2021 14:53

@t3chb0t stackoverflow.com/questions/44836984/…

Oleg 17.01.2021 18:33
Calendar.getInstance().get(Calendar.DAY_OF_WEEK); 

даст вам тот же результат

- старомодный и не рекомендуемый способ. Класс Calendar давно устарел и плохо разработан, поэтому, если о нем не спрашивают, пожалуйста, не вводите его. Также это даст вам тупой номер, который, по крайней мере, я никогда не могу вспомнить, как его интерпретировать. Современный код дает константу перечисления с поясняющим именем.

Ole V.V. 29.05.2019 18:56

Я начислил баллы techtabu, но вместо этого использовал atOffset. Вот где я оказался...

int currentDayOfWeekValue = Instant.now().atOffset(ZoneOffset.UTC).getDayOfWeek().getValue();

Я поражен тем, насколько сложны библиотеки даты и времени Java8. Существует так много вариантов похожих понятий...

  • Мгновенное
  • Местная Дата
  • Местное время
  • Местная ДатаВремя
  • OffsetDateTime
  • ZoneOffset
  • ЗонедДатеВремя

Риторические вопросы:

Zulu и UTC — это одно и то же или разные?

Какой часовой пояс связан с Instant.now() - результаты предполагают Zulu?

Почему я не могу манипулировать объектом Instant, например, LocalDateTime — методы похожи, но отличаются?

Чем отличаются ZonedDateTime и OffsetDateTime - они, кажется, обращаются к одной и той же концепции.

Просто названия Zulu и UTC одинаковы (придирки могут сказать, что Zulu смещено от UTC до нуля, поэтому концептуально это не совсем то же самое, но время то же). С Instant связан часовой пояс или смещение нет. ZonedDateTime — это дата и время в часовом поясе, таком как America/Los_Angeles, и оно будет учитывать летнее время в вашем часовом поясе, когда вы добавляете к нему дни или месяцы. OffsetDateTime — это дата и время со смещением вроде -08:00, и день всегда будет считаться как 24 часа.

Ole V.V. 29.05.2019 20:44
Instant и LocalDateTime оба являются нейтральными часовыми поясами, но это совершенно разные звери. Instant — это то, о чем говорит название класса. Вы могли бы также сказать момент времени. Поскольку часовой пояс нейтральный, у него действительно нет имени (но его toString выдает дату и время в формате UTC). LocalDateTime — это дата и время суток без часового пояса или смещения, поэтому нет определяет момент.
Ole V.V. 29.05.2019 20:50

Проще: либо OffsetDateTime.now(ZoneOffset.UTC).getDayOfWeek(), либо, например, LocalDate.now(ZoneOffset.UTC).getDayOfWeek().

Ole V.V. 29.05.2019 21:04

OffsetDateTime не учитывает летнее время

Alexander 26.11.2019 17:35

@Alexander Александр - правильный UTC не учитывает летнее время (DST). Это то, что я хочу - UTC без перехода на летнее время и без системного дефолта, и без вмешательства местного времени. Я просто хочу, чтобы UTC был в самом необработанном формате и не менялся на произвольные правительственные правила, такие как летнее время. Фактически, в штате Орегон была введена мера голосования по отмене летнего времени. Похоже на Калифорнию, насколько я понимаю.

barrypicker 26.11.2019 20:10

Имеет смысл. Спасибо за разъяснения.

Alexander 27.11.2019 09:35

Другие вопросы по теме