不正确的问题
问题假定结果应该是上午 10 点 (10:00:00)。这是不正确的。
根据ISO 8601 等标准,-07:00 的偏移量表示“落后UTC 7 小时”。不要将其视为带有减号的代数公式。正好相反,翻转标志以制作公式以获取UTC。
所以17:00:00-07:00 的值调整为00:00:00(第二天)。下午 5 点再增加 7 小时,您将进入午夜。
解决方案
起初我以为可以使用DateTimeFormatter 解析然后在Joda-Time 中实例化一个LocalTime 类来找到答案。但是本地时间解析器会忽略(截断)偏移量,而不是将其用作调整。
因此,作为一种解决方法,我使用DateTime 来解析时间,就好像发生在 Unix 纪元的第一天(1970 UTC 开始)。然后我切换到 LocalTime 对象。
String input = "17:00:00-07:00";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "HH:mm:ssZ" );
DateTime dateTime = formatter.parseDateTime( input ).withZone( DateTimeZone.UTC );
LocalTime localTime = dateTime.toLocalTime();
转储到控制台。
System.out.println( "dateTime: " + dateTime );
System.out.println( "localTime: " + localTime );
运行时。请注意,在下午 5 点加上 7 小时后,我们会看到午夜的钟声,即第二天的第一刻(1 月 2 日而不是 1 日)。
dateTime: 1970-01-02T00:00:00.000Z
localTime: 00:00:00.000
为 ISO 8601 输入添加 T
如果您在输入字符串前添加 T 以符合 ISO 8601,则可以使用 Joda-Time 的内置默认解析器省略一行代码。
String input = "T" + "17:00:00-07:00"; // Prepend a "T" to comply with ISO 8601 format.
DateTime dateTime = new DateTime( input ).withZone( DateTimeZone.UTC ); // Pass standard string to constructor of DateTime. Or pass to static method DateTime.parse().
LocalTime localTime = dateTime.toLocalTime();