Дата и календарь Java без понятия TimeZone (независимо от часового пояса) - PullRequest
1 голос
/ 23 августа 2011

Мне нужно записать время различных систем, поведение которых по умолчанию будет преобразовывать время ввода в часовой пояс систем. Пока что я хочу отключить конвертирование. Поэтому в системе 1 мне нужно создать календарь, часовой пояс которого совпадает с часовым поясом системы 2. Например, часовой пояс по умолчанию для системы 1 - PDT, часовой пояс по умолчанию для системы 2 - GMT, время, необходимое для создания календаря, - 2011/08/23 : 00 в PDT, мне нужно создать календарь в системе 1, например 2011/08/23 4:00 по Гринвичу.

Другими словами, как создать календарь без понятия часового пояса

Ответы [ 7 ]

6 голосов
/ 23 августа 2011

Я бы отказался от java.util.{Date, Calendar} в этот момент и убежал бы в комфорт Время Йода , где вы бы создали LocalDateTime.(Joda Time - намного превосходящий API по дате / времени.)

Если вы действительно хотите придерживаться Calendar, вы можете просто использовать один и тот же часовой пояс везде - самый простой подходUTC, поскольку это не имеет летнего времени.

В качестве альтернативы, не ясно, что вы действительно хотите Calendar без понятия TimeZone - но Calendar который использует TimeZone, отличный от системного по умолчанию - что легко;Вы просто устанавливаете часовой пояс для календаря явно.Конечно, вам нужно знать часовой пояс другой системы таким образом ...

Если вы можете дать более подробную информацию о том, какую информацию вы знаете и что вам нужно с ней делать, мы можем помочьты больше.

3 голосов
/ 23 августа 2011

Calendar из определения является датой в некоторой календарной системе (обычно григорианский ) и в указанном TimeZone.

Если вам не важен часовой пояс (или, точнее, вам нужны моменты времени независимо от часового пояса), просто используйте Date. Несмотря на название, в действительности в нем хранится точный момент времени, а не дата в каком-либо календаре.

2 голосов
/ 23 августа 2011

Как насчет использования long времени эпохи, возвращенного System.currentTimeMillis() и друзьями?

1 голос
/ 23 августа 2011

java.util.Date не имеет понятия часового пояса, это просто тонкая оболочка вокруг временной метки GMT (если используется правильно). Это может показаться иначе, потому что его метод toString() и некоторые другие устаревшие методы класса неявно используют часовой пояс системы по умолчанию.

Calendar требуется только для вычисления даты, поэтому вам вообще не нужно его использовать. Все, что вам нужно, это использовать SimpleDateFormat с правильным часовым поясом для преобразования (формат / анализ) между Date экземплярами (у которых нет часового пояса) и String представлениями (у которых есть один, возможно, по Гринвичу).

0 голосов
/ 20 сентября 2016

java.time

Ответ Джона Скита правильный, но сейчас устарел.

Как он сказал, старые унаследованные классы даты и времени - беспорядок, и его следует избегать. Проект Joda-Time в настоящее время находится в режиме обслуживания, и команда советует перейти на java.time.

LocalDateTime

Класс LocalDateTime представляет дату и время суток с разрешением наносекунд. Это значение не привязано к временной шкале без какой-либо концепции смещение от UTC и часового пояса.

Таким образом, не представляет фактический момент, но потенциальный момент. Когда вы помещаете его в контекст смещения или часового пояса, вы наполняете новое значение (OffsetDateTime или ZonedDateTime) значением, которое становится точкой на график времени.

Например, 2016-12-25T00:00:00 - это когда Рождество начинается в этом году. Но этот полуночный инсульт случается первым в Тихом океане, например, в Окленде, Новая Зеландия, то есть раньше Рождества в Калькутте, Индии . А Рождество начинается еще позже, в 1036 году, в Париже, во Франции, в 1037 году, еще позже, в 1038 году, в Монреале, Квебеке. Вот почему Санта начинается на востоке и работает на запад со своими поставками.

LocalDateTime xmas2016 = LocalDateTime.of( 2016 , Month.DECEMBER , 25 , 0 , 0 ) ;

Зонная

Хотя ваш Вопрос неясен, я подозреваю, что вам действительно нужны значения даты и времени в UTC. Все ваши различные входы в разных часовых поясах должны быть нормализованы в UTC.

Программисты должны думать о UTC как о One True Time . Большая часть вашей бизнес-логики, ведения журналов, хранения данных и обмена данными, как правило, должна выполняться в UTC. Я предлагаю вам оставить на вашем столе вторые часы в формате UTC.

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд .

Instant instant = Instant.now();

Когда вам нужно посмотреть время настенных часов для некоторого смещения от UTC , примените ZoneOffset, чтобы получить OffsetDateTime объект. Чтобы увидеть время на часах для некоторого часового пояса , примените ZoneId, чтобы получить ZonedDateTime.

ZonedDateTime xmas2016Montréal = xmas2016.atZone( ZoneId.of( "America/Montreal" ) );

Оба этих смещенных / зональных объекта даты и времени могут вернуть вас к Instant с вызовом toInstant.

Instant instant = xmas2016Montréal.toInstant();  // Convert to UTC.

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date, .Calendar, и java.text.SimpleDateFormat.

Проект Joda-Time , который теперь находится в режиме обслуживания , рекомендует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений.

Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована к Android в ThreeTenABP (см. Как пользоваться… ).

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 20 сентября 2016

Там может быть много вариантов использования, таких как - нам не нужен часовой пояс - нам не нужны часы - нам не нужны минуты - нам не нужны миллисекунды

В таких случаях мы можем просто очистить высокие поля, которые вызывают проблемы и не требуются

calendar.clear(Calendar.ZONE_OFFSET);
calendar.clear(Calendar.MILLISECOND);
calendar.clear(Calendar.HOUR);
calendar.clear(Calendar.MINUTE);

Все такие поля перечислены здесь - эта ссылка может быть полезной

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

0 голосов
/ 24 августа 2011

Посмотрите на Вейдер-тайм .Это простая и эффективная структура для манипулирования временем и датой, которая имеет естественное представление об этих объектах.Veyder-time полностью свободен от всех сложностей, таких как часовые пояса, эпохи, эпохи, различные календарные системы и т. Д.

С Veyder-time создавать объекты времени и даты без часового пояса просто.Посмотрите на эти примеры:

Time now = Time.factory.now();
Time time = Time.factory.parse("2011-08-01 12:49:21.123");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...