Java Date, рендер с определенным дневным режимом - PullRequest
3 голосов
/ 19 ноября 2009

У меня есть Java Date, выпущенная этим летом в летнее время. Например:

01 июня 2009 г., 06:00 по тихоокеанскому времени

У меня вопрос, как мне отобразить эту дату в качестве моего местного часового пояса и текущий режим летнего времени (в моем случае тихоокеанское стандартное время)?

01 июня 2009 г. 05:00 по тихоокеанскому времени

Java Date.toString() и SimpleDateFormat отображают дату в оригинальном режиме перехода на летнее время. Пример:

System.out.println(new Date(1243861200000L));

выходы:

Пн Июн 01 06:00:00 PDT 2009

DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy hh:mm aa zzz");
dateFormat.setTimeZone(TimeZone.getTimeZone("PST"));
System.out.println(dateFormat.format(new Date(1243861200000L)));

выходы:

01 июня 2009 г. 06:00 по тихоокеанскому времени

Что я действительно хочу увидеть, так это 5:00 AM PST (что эквивалентно 6:00 AM PDT). Есть ли способ заставить его использовать другой режим перехода на летнее время?

Продолжение: Кстати, это поведение Windows XP. Файл, созданный 1 июня в 6 часов утра (будет виден проводником, в командной строке и т. Д.) Зимой 1 июня в 5 часов утра.

Ответы [ 4 ]

2 голосов
/ 19 ноября 2009

PST / PDT меняются в течение года. Java пытается определить, какой из них влияет на данную дату. Очевидно, что все меняется с изменением законов и регионов. Можете ли вы использовать абсолютный часовой пояс? Задание смещения по Гринвичу будет в том же году.

    DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy hh:mm aa zzz");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT-07:00"));
    System.out.println(dateFormat.format(new Date(1243861200000L)));

Jun 01, 2009 06:00 AM GMT-07:00
2 голосов
/ 19 ноября 2009

Я не думаю, что есть способ заставить DateFormat применить формат TimeZone ко времени, которое не может существовать. PST применяется только в зимние месяцы, а PDT используется только летом.

Я отформатировал эту дату со всеми TimeZone, возвращенными TimeZone.getAvailableIDs(), и нашел две, которые возвращали мне PST за это конкретное время: Pacific / Pitcairn и SystemV / PST8. Вы можете попробовать использовать один из них, но я понятия не имею, какие другие правила применяются к любому из этих объектов часового пояса.

Если вы просто заинтересованы в получении времени с этим смещением, вы можете использовать GMT-8 в качестве временной зоны. Однако эта строка будет отображаться в вашей отформатированной строке даты вместо PST.

ОБНОВЛЕНИЕ: Вот способ взять любой часовой пояс и заставить его игнорировать все правила перехода на летнее время. Вы можете получить объект TimeZone, а затем получить другой объект TimeZone.getTimeZone(). На втором объекте установите Id и rawOffset на соответствующий объект с первого TimeZone.

Например:

    DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy hh:mm aa zzz");
    TimeZone defaultTimeZone = TimeZone.getDefault();
    TimeZone timeZone = TimeZone.getTimeZone("");
    timeZone.setID(defaultTimeZone.getID());
    timeZone.setRawOffset(defaultTimeZone.getRawOffset());
    dateFormat.setTimeZone(timeZone);
    System.out.println(dateFormat.format(new Date(1243861200000L)));

Это напечатает именно то, что вы ищете.

1 голос
/ 19 ноября 2009

это может помочь:

    /*
     * Create a date that represents 1,243,861,200,000 milliseconds since
     * Jan 1, 1970
     */
    Date date = new Date(1243861200000L);

    /*
     * Print out the date using the current system's default format and time
     * zone. In other words, this will print differently if you set the
     * operating zone's time zone differently.
     */
    System.out.println(date);

    /*
     * Specify the format and timezone to use
     */
    DateFormat dateFormat = new SimpleDateFormat(
            "MMM dd, yyyy hh:mm aa zzz");
    TimeZone pstTZ = TimeZone.getTimeZone("PST");
    dateFormat.setTimeZone(pstTZ);
    System.out.println(dateFormat.format(date));

    /*
     * It looks like what you want is to actually display a different date
     * (different # milliseconds since epoch) in the summer months. To do that, you
     * need to change the date by subtracting an hour.
     */
    if(pstTZ.inDaylightTime(date)){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR, -1);
        date = cal.getTime();
    }
    //now this should always print "5:00". However, it will show as 5:00 PDT in summer and 5:00 PST in the winter which are actually 2 different dates. So, I think you might need to think about exactly what it is you're trying to achieve. 
    System.out.println(dateFormat.format(date));
0 голосов
/ 05 января 2012
DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy hh:mm aa zzz"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("Pacific/Pitcairn")); 
System.out.println(dateFormat.format(new Date(1243861200000L)));

Дополнительные комментарии: zzz распечатает PST, а z распечатает GMT-08: 00. TimeZone.getTimeZone ("EST") работает для восточного стандартного времени, заставляя меня думать, что это ошибка в TimeZone.getTimeZone ("PST").

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

public static final TimeZone ZONE_GREENWICH_MEAN_TIME = TimeZone.getTimeZone("GMT");
public static final TimeZone ZONE_EASTERN_DAYLIGHT_TIME = TimeZone.getTimeZone("America/New_York"); // EDT, GMT-04:00
public static final TimeZone ZONE_EASTERN_STANDARD_TIME = TimeZone.getTimeZone("EST"); // GMT-05:00
public static final TimeZone ZONE_PACIFIC_DAYLIGHT_TIME = TimeZone.getTimeZone("America/Los_Angeles"); // PDT, GTM-0700
public static final TimeZone ZONE_PACIFIC_STANDARD_TIME = TimeZone.getTimeZone("Pacific/Pitcairn"); // PST, GMT-08:00

В другой раз я столкнулся с подобной проблемой "2009-11-01 08:44:44". Я попытался перебрать все идентификаторы, и ни один не напечатал EDT. Самое смешное, что "2010-11-01 08:44:44" будет печатать EDT. В период с 1990 по 2010 год только 2007, 2008 и 2010 годы будут печатать EDT. Когда я проверил годы от 0 до 2499, только у 431 был EDT, с первым в 1940 (это должно быть, когда EDT был введен). Таким образом, из 560 лет (1940-2499) только 431 имеют удостоверение личности, которое печатает EDT. С 1940 по 2006 год существует только 10 лет с удостоверениями личности, которые печатают EDT. После 2006 года, каждые 4, 5 или 10 лет, существует год, который не будет печатать EDT.

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