Java Jodatime时区转换

Java Jodatime时区转换,java,datetime,timezone,jodatime,timezone-offset,Java,Datetime,Timezone,Jodatime,Timezone Offset,我使用Joda时间来验证时区的时间戳。当我通过无效的日期或时间时,它按预期工作。例如,当我超过99秒时,它给出了以下错误: Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "20131231235999+00": Value 99 for secondOfMinute must be in the range [0,59] 我希望它会抛出一个类似的异常,因为我也通过了无效时区

我使用Joda时间来验证时区的时间戳。当我通过无效的日期或时间时,它按预期工作。例如,当我超过99秒时,它给出了以下错误:

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小时()。当偏移值超过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
publicstaticvoidmain(String[]args)抛出ParseException、DatatypeConfigurationException
{
DateTimeFormatter dtf=DateTimeFormat.forPattern(“yyyyymmddhhmmssz”)。带Zoneutc();
字符串dateString=“”;
对于(int i=0;i<24;i++)
{
如果(i<10)
{
dateString=“20131231235959+0”+i;
DateTime dt1=dtf.parseDateTime(日期字符串);
System.err.println(日期字符串+“=”+dt1);
}
其他的
{
dateString=“20131231235959+”+i;
DateTime dt1=dtf.parseDateTime(日期字符串);
System.err.println(日期字符串+“=”+dt1);
}
}
对于(int i=0;i<24;i++)
{
如果(i<10)
{
dateString=“20131231235959-0”+i;
DateTime dt1=dtf.parseDateTime(日期字符串);
System.err.println(日期字符串+“=”+dt1);
}
其他的
{
dateString=“20131231235959-”+i;
DateTime dt1=dtf.parseDateTime(日期字符串);
System.err.println(日期字符串+“=”+dt1);
}
}
}
输出:
20131231235959+00=2013-12-31T23:59:59.000Z 201312312355959-00=2013-12-31T23:59:59.000Z
20131231235959+01=2013-12-31T22:59:59.000Z 20131231231235959-01=2014-01-01T00:59:59.000Z
20131231235959+02=2013-12-31T21:59:59.000Z 201312312355959-02=2014-01-01T01:59:59.000Z
20131231235959+03=2013-12-31T20:59:59.000Z 20131231231235959-03=2014-01-01T02:59:59.000Z
20131231235959+04=2013-12-31T19:59:59.000Z 201312312355959-04=2014-01-01T03:59:59.000Z
20131231235959+05=2013-12-31T18:59:59.000Z 201312312355959-05=2014-01-01T04:59:59.000Z
20131231235959+06=2013-12-31T17:59:59.000Z 201312312355959-06=2014-01-01T05:59:59.000Z
20131231235959+07=2013-12-31T16:59:59.000Z 201312312355959-07=2014-01-01T06:59:59.000Z
20131231235959+08=2013-12-31T15:59:59.000Z 201312312355959-08=2014-01-01T07:59:59.000Z
20131231235959+09=2013-12-31T14:59:59.000Z 201312312355959-09=2014-01-01T08:59:59.000Z
20131231235959+10=2013-12-31T13:59:59.000Z 201312312355959-10=2014-01-01T09:59:59.000Z
20131231235959+11=2013-12-31T12:59:59.000Z 20131231231235959-11=2014-01-01T10:59:59.000Z
20131231235959+12=2013-12-31T11:59:59.000Z 20131231231235959-12=2014-01-01T11:59:59.000Z
20131231235959+13=2013-12-31T10:59:59.000Z 20131231231235959-13=2014-01-01T12:59:59.000Z
20131231235959+14=2013-12-31T09:59:59.000Z 201312312355959-14=2014-01-01T13:59:59.000Z
20131231235959+15=2013-12-31T08:59:59.000Z 201312312355959-15=2014-01-01T14:59:59.000Z
20131231235959+16=2013-12-31T07:59:59.000Z 201312312355959-16=2014-01-01T15:59:59.000Z
20131231235959+17=2013-12-31T06:59:59.000Z 201312312355959-17=2014-01-01T16:59:59.000Z
20131231235959+18=2013-12-31T05:59:59.000Z 201312312355959-18=2014-01-01T17:59:59.000Z
20131231235959+19=2013-12-31T04:59:59.000Z 201312312355959-19=2014-01-01T18:59:59.000Z
20131231235959+20=2013-12-31T03:59:59.000Z 201312312355959-20=2014-01-01T19:59:59.000Z
20131231235959+21=2013-12-31T02:59:59.000Z 20131231231235959-21=2014-01-01T20:59:59.000Z
20131231235959+22=2013-12-31T01:59:59.000Z 201312312355959-22=2014-01-01T21:59:59.000Z
20131231235959+23=2013-12-31T00:59:59.000Z 20131231231235959-23=2014-01-01T22:59:59.000Z
谢谢

A和ISO 8601中的

当需要指示当地时间和一天的UTC之间的差异时,表示 差异可以用小时和分钟表示,也可以仅用小时表示。其应表示为阳性(即带有 如果当地时间早于或等于当日UTC,且为负数(即 前导减号[-]),如果它落后于当日UTC。差异的分钟时间元素可能仅为 如果时间刻度之间的差正好是整小时数,则省略。 基本格式:±hhmm示例:+0100 ±hh+01 扩展格式:±hh:mm示例:+01:00


它没有明确提到范围,但它们使用的字母与小时相同。考虑到这似乎意味着偏移量的范围与时间表示的小时值的范围相同。

我感觉它与“仅仅因为这是当前范围,它可能并不总是”心态有关。鉴于已经存在大于12的绝对偏移量,因此任何小于一整天的偏移量都是有效的。然而,绝对偏移量为24或更大是非常奇怪的(特别是因为这不一定是“一整天”)