Предполагая следующий код...
Instant x = Instant.now();
Как получить день недели из x?
Instant
— это абсолютное значение времени, день недели будет зависеть от того, где вы находитесь на Земле.
@JimGarrison - насколько я понимаю, любой экземпляр Instant предполагается Zulu или UTC, что подразумевает Гринвич. Не могли бы мы вывести из этого день недели?
Нет, как упоминает @techtabu в своем ответе, вы должны явно указать часовой пояс.
Вы должны преобразовать его в ZonedDateTime
Instant.now().atZone(ZoneId.systemDefault()).getDayOfWeek()
atZone(ZoneId.of("UTC"))
с большей вероятностью даст желаемый результат.
@Олег - спасибо. Вы правы, мне не нужно местное время, поэтому я использую Instant.
OffsetDateTime
достаточно и в случае UTC имеет больше смысла. Также @Олег
@Олег, неужели там нужно использовать строку? Неужели нет констант? :\
@t3chb0t stackoverflow.com/questions/44836984/…
Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
даст вам тот же результат
- старомодный и не рекомендуемый способ. Класс Calendar
давно устарел и плохо разработан, поэтому, если о нем не спрашивают, пожалуйста, не вводите его. Также это даст вам тупой номер, который, по крайней мере, я никогда не могу вспомнить, как его интерпретировать. Современный код дает константу перечисления с поясняющим именем.
Я начислил баллы techtabu, но вместо этого использовал atOffset. Вот где я оказался...
int currentDayOfWeekValue = Instant.now().atOffset(ZoneOffset.UTC).getDayOfWeek().getValue();
Я поражен тем, насколько сложны библиотеки даты и времени Java8. Существует так много вариантов похожих понятий...
Zulu и UTC — это одно и то же или разные?
Какой часовой пояс связан с Instant.now() - результаты предполагают Zulu?
Почему я не могу манипулировать объектом Instant, например, LocalDateTime — методы похожи, но отличаются?
Чем отличаются ZonedDateTime и OffsetDateTime - они, кажется, обращаются к одной и той же концепции.
Просто названия Zulu и UTC одинаковы (придирки могут сказать, что Zulu смещено от UTC до нуля, поэтому концептуально это не совсем то же самое, но время то же). С Instant
связан часовой пояс или смещение нет. ZonedDateTime
— это дата и время в часовом поясе, таком как America/Los_Angeles, и оно будет учитывать летнее время в вашем часовом поясе, когда вы добавляете к нему дни или месяцы. OffsetDateTime
— это дата и время со смещением вроде -08:00, и день всегда будет считаться как 24 часа.
Instant
и LocalDateTime
оба являются нейтральными часовыми поясами, но это совершенно разные звери. Instant
— это то, о чем говорит название класса. Вы могли бы также сказать момент времени. Поскольку часовой пояс нейтральный, у него действительно нет имени (но его toString
выдает дату и время в формате UTC). LocalDateTime
— это дата и время суток без часового пояса или смещения, поэтому нет определяет момент.
Проще: либо OffsetDateTime.now(ZoneOffset.UTC).getDayOfWeek()
, либо, например, LocalDate.now(ZoneOffset.UTC).getDayOfWeek()
.
OffsetDateTime не учитывает летнее время
@Alexander Александр - правильный UTC не учитывает летнее время (DST). Это то, что я хочу - UTC без перехода на летнее время и без системного дефолта, и без вмешательства местного времени. Я просто хочу, чтобы UTC был в самом необработанном формате и не менялся на произвольные правительственные правила, такие как летнее время. Фактически, в штате Орегон была введена мера голосования по отмене летнего времени. Похоже на Калифорнию, насколько я понимаю.
Имеет смысл. Спасибо за разъяснения.
Связанный stackoverflow.com/questions/33353190/…