Java Date (Calendar), вычисляющий начало дня по местному времени с учетом даты и времени - PullRequest
1 голос
/ 28 сентября 2011

All

У меня тяжелый рабочий день в офисе ... Я пытаюсь начать день с начала по местному времени, то есть с полуночи 00:00:00, учитывая любую календарную дату.

Учитывая следующие дни, я хочу вычислить начало дня по местному времени в полночь:

       Time                     Start Day (Local)            Start Day (GMT)
2011-03-27 00:00:00 GMT -->     2011-03-27 00:00:00 GMT -->  2011-03-27 00:00:00 GMT
2011-03-27 01:00:00 GMT -->     2011-03-27 00:00:00 GMT -->  2011-03-27 00:00:00 GMT
2011-03-27 02:00:00 GMT -->     2011-03-27 00:00:00 GMT -->  2011-03-27 00:00:00 GMT
2011-04-01 00:00:00 BST -->     2011-04-01 00:00:00 BST -->  2011-03-31 23:00:00 GMT
2011-10-30 00:00:00 BST -->     2011-10-30 00:00:00 BST -->  2011-10-29 23:00:00 GMT
2011-10-30 01:00:00 BST -->     2011-10-30 00:00:00 BST -->  2011-10-29 23:00:00 GMT
2011-10-30 01:00:00 GMT -->     2011-10-30 00:00:00 BST -->  2011-10-29 23:00:00 GMT
2011-11-01 00:00:00 GMT -->     2011-11-01 00:00:00 GMT -->  2011-11-01 00:00:00 GMT

В настоящее время я анализирую String Time в GregorianCalendar с использованием SimpleDateFormat. Это дает мне время по Гринвичу / UTC для расчета.

Итак, у меня есть некоторый код, который анализирует строку в GregorianCalendar:

public GregorianCalendar getCalendar(String dateTime) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(sdf.parse(dateTime, new ParsePosition(0)));

    return cal;
}

Теперь мне нужно установить локальную полночь:

public void setToStartOfDayLocally(GregorianCalendar cal) {
    ????
}

Я не слишком уверен, что мне нужно делать в минуту с Календарем. К сожалению, мы не переезжаем на свидание JODA в ближайшее время. Я также не учитываю различные часовые пояса с моим примером.

Есть мысли?

Спасибо

Andez

Ответы [ 3 ]

0 голосов
/ 28 сентября 2011

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

public static Date convertLocalDateToDateTimezone( Date localDate, String timezone ) {
   TimeZone localTimeZone = TimeZone.getDefault();
   TimeZone timezone = TimeZone.getTimeZone( timezone );
   long gmtMillis = localDate.getTime();
   long result = gmtMillis + timezone.getOffset( gmtMillis ) - localTimeZone.getOffset(     gmtMillis );
   return new Date( result );
}

Надеюсь, это поможет.

0 голосов
/ 01 апреля 2016

java.time

Вы используете устаревшие классы.В Java 8 и более поздних версиях используйте встроенную java.time framework.

Не думайте, что день начинается в момент времени 00:00:00.0.Из-за таких аномалий, как летнее время (DST), начало дня может меняться в зависимости от часового пояса.Пусть классы java.time определяют правильное время с помощью вызова LocalDate::atStartOfDay.

Избегайте использования 3-4 буквенных сокращений зоны, таких как BST, EST и т. Д.на.Они не стандартизированы и не уникальны.Используйте правильные имена часовых поясов .

An Instant - это момент на временной шкале в UTC .Примените часовой пояс, чтобы получить ZonedDateTime.Из этой даты-времени извлеките значение только для даты: LocalDate.Примените часовой пояс с вызовом к atStartOfDay, чтобы вернуться к ZonedDateTime, установленному на первый момент дня в этом часовом поясе.

Instant now = Instant.now();
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
ZonedDateTime zdtStart = localDate.atStartOfDay( zoneId );

Совет: избегайте слова «полночь».Не имеет точного определения.Некоторые люди думают о попытке определить последний момент дня, что является проблемой из-за бесконечно делимой доли секунды.Некоторые люди думают о специальной строке «24:00», которая указывает на удар в полночь, что еще больше сбивает с толку обработку даты и времени.Опыт проекта Joda-Time учит нас, что лучше всего сосредоточиться на «первом моменте дня» как на ясном и точном значении.Также имейте в виду, что первый момент - , а не , всегда 00:00:00, из-за перехода на летнее время (DST) и других аномалий в некоторых часовых поясах.Вот почему мы зависим от метода atStartOfDay, а не от жесткого кодирования нулевого времени суток.

0 голосов
/ 28 сентября 2011

Похоже, вы просто хотите установить все части времени на ноль.Вы можете использовать:

cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

(при условии, что часовой пояс установлен в календаре правильно).

Обратите внимание, что это не обязательно обязательно , хотя- в некоторых часовых поясах (например, в Бразилии) при переходе на летнее время полночь либо происходит дважды, либо не происходит вовсе.

Лично я бы начал шуметь о переходе на Joda Time, хотя это делает все этонамного проще:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...