2013-04-03 3 views
0

Я использую время Джоды для проверки временной метки с часовым поясом. Когда я прошел недействительную дату или время, он работал, как ожидалось. Например, когда я прохожу 99 секунды, как он дал следующую ошибку:Jodatime часовой пояс преобразование

Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot 
parse "20131231235999+00": Value 99 for secondOfMinute must be in the range [0,59] 

Я ожидал, что бросить подобное исключение с я передал недействительный часовой пояс, а также. Я ожидал, что это значение UTC смещает значения меньше -12 и больше +14 часов (http://en.wikipedia.org/wiki/List_of_time_zones_by_UTC_offset). Это дало следующую ошибку, когда значение смещения превышает 23 часа.

Exception in thread "main" java.lang.IllegalArgumentException: Invalid 
format: "20131231235959+24" is malformed at "24" 

Я думаю, что у меня что-то отсутствует, так как это указывает на ошибку в течение 24-го часа. Может кто-то объяснить, почему он позволяет смещать значения < -12 и> 14 часов.

Ниже приведен пример программы с выводом для различных смещений:

public static void main(String[] args) throws ParseException, DatatypeConfigurationException 
{ 
    DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyyMMddHHmmssZ").withZoneUTC(); 
    String dateString = ""; 

    for (int i = 0; i < 24; i++) 
    { 
     if (i < 10) 
     { 
      dateString = "20131231235959+0" + i; 
      DateTime dt1 = dtf.parseDateTime(dateString); 
      System.err.println(dateString + " = " + dt1); 
     } 
     else 
     { 
      dateString = "20131231235959+" + i; 
      DateTime dt1 = dtf.parseDateTime(dateString); 
      System.err.println(dateString + " = " + dt1); 
     } 
    } 


    for (int i = 0; i < 24; i++) 
    { 
     if (i < 10) 
     { 
      dateString = "20131231235959-0" + i; 
      DateTime dt1 = dtf.parseDateTime(dateString); 
      System.err.println(dateString + " = " + dt1); 
     } 
     else 
     { 
      dateString = "20131231235959-" + i; 
      DateTime dt1 = dtf.parseDateTime(dateString); 
      System.err.println(dateString + " = " + dt1); 
     } 
    } 
} 

Output: 

20131231235959+00 = 2013-12-31T23:59:59.000Z 20131231235959-00 = 2013-12-31T23:59:59.000Z 
20131231235959+01 = 2013-12-31T22:59:59.000Z 20131231235959-01 = 2014-01-01T00:59:59.000Z 
20131231235959+02 = 2013-12-31T21:59:59.000Z 20131231235959-02 = 2014-01-01T01:59:59.000Z 
20131231235959+03 = 2013-12-31T20:59:59.000Z 20131231235959-03 = 2014-01-01T02:59:59.000Z 
20131231235959+04 = 2013-12-31T19:59:59.000Z 20131231235959-04 = 2014-01-01T03:59:59.000Z 
20131231235959+05 = 2013-12-31T18:59:59.000Z 20131231235959-05 = 2014-01-01T04:59:59.000Z 
20131231235959+06 = 2013-12-31T17:59:59.000Z 20131231235959-06 = 2014-01-01T05:59:59.000Z 
20131231235959+07 = 2013-12-31T16:59:59.000Z 20131231235959-07 = 2014-01-01T06:59:59.000Z 
20131231235959+08 = 2013-12-31T15:59:59.000Z 20131231235959-08 = 2014-01-01T07:59:59.000Z 
20131231235959+09 = 2013-12-31T14:59:59.000Z 20131231235959-09 = 2014-01-01T08:59:59.000Z 
20131231235959+10 = 2013-12-31T13:59:59.000Z 20131231235959-10 = 2014-01-01T09:59:59.000Z 
20131231235959+11 = 2013-12-31T12:59:59.000Z 20131231235959-11 = 2014-01-01T10:59:59.000Z 
20131231235959+12 = 2013-12-31T11:59:59.000Z 20131231235959-12 = 2014-01-01T11:59:59.000Z 
20131231235959+13 = 2013-12-31T10:59:59.000Z 20131231235959-13 = 2014-01-01T12:59:59.000Z 
20131231235959+14 = 2013-12-31T09:59:59.000Z 20131231235959-14 = 2014-01-01T13:59:59.000Z 
20131231235959+15 = 2013-12-31T08:59:59.000Z 20131231235959-15 = 2014-01-01T14:59:59.000Z 
20131231235959+16 = 2013-12-31T07:59:59.000Z 20131231235959-16 = 2014-01-01T15:59:59.000Z 
20131231235959+17 = 2013-12-31T06:59:59.000Z 20131231235959-17 = 2014-01-01T16:59:59.000Z 
20131231235959+18 = 2013-12-31T05:59:59.000Z 20131231235959-18 = 2014-01-01T17:59:59.000Z 
20131231235959+19 = 2013-12-31T04:59:59.000Z 20131231235959-19 = 2014-01-01T18:59:59.000Z 
20131231235959+20 = 2013-12-31T03:59:59.000Z 20131231235959-20 = 2014-01-01T19:59:59.000Z 
20131231235959+21 = 2013-12-31T02:59:59.000Z 20131231235959-21 = 2014-01-01T20:59:59.000Z 
20131231235959+22 = 2013-12-31T01:59:59.000Z 20131231235959-22 = 2014-01-01T21:59:59.000Z 
20131231235959+23 = 2013-12-31T00:59:59.000Z 20131231235959-23 = 2014-01-01T22:59:59.000Z 

Спасибо,

Anand

+0

У меня такое чувство, что оно связано с «просто потому, что это текущий диапазон, это может не всегда быть» мышлением. Учитывая, что абсолютное смещение, превышающее 12, уже присутствует, значит, что-то меньшее, чем полный день. Абсолютное смещение 24 или выше было бы чрезвычайно странным, тем не менее (особенно потому, что это не обязано быть «одним полным днем» ....) –

ответ

0

С ISO 8601:

When it is required to indicate the difference between local time and UTC of day, the representation of the difference can be expressed in hours and minutes, or hours only. It shall be expressed as positive (i.e. with the leading plus sign [+]) if the local time is ahead of or equal to UTC of day and as negative (i.e. with the leading minus sign [-]) if it is behind UTC of day. The minutes time element of the difference may only be omitted if the difference between the time scales is exactly an integral number of hours. Basic format: ±hhmm Example: +0100 ±hh +01 Extended format: ±hh:mm Example: +01:00

Он не упоминает диапазон, но они используют те же буквы, что и в течение нескольких часов. Учитывая, что joda time uses ISO 8601 by default, кажется, подразумевается, что диапазон смещения совпадает с диапазоном для значения часов представления времени.

Смежные вопросы