修改输入
据我所知,Java 的三个常见日期时间框架(旧的捆绑 java.util.Date/.Calendar/java.text.SimpleDateFormat 类、Joda-Time 框架或构建的 java.time 框架)都没有Java 8 及更高版本中)允许将相对于 UTC 的偏移量作为总分钟数。
正如建议的索蒂里奥斯·德利马诺利斯,您必须修改与 UTC 的偏移量将总分钟数转换为标准的小时数和分钟数(以及秒数 - 这种奇怪的 Microsoft 格式会忽略这种可能性)。所以-420
应该成为-07:00
or -07:00:00
.
java.time
您正在使用与最早版本的 Java 捆绑在一起的麻烦的旧日期时间类。旧的类现在已成为遗产,并已被新的类所取代。java.timeJava 8 及更高版本中内置的框架,并且很大程度上由 ThreeTen-Backport 向后移植到 Java 6 和 7项目及进一步适配安卓.
java.time 类的分辨率为纳秒,最多九位秒的小数部分。因此,处理您输入的 4-6 位小数秒没有问题。
我们的策略分为两部分:(a) 修改输入以转换相对于 UTC 的偏移量,以及 (b) 将修改后的输入字符串解析为日期时间对象。
修改输入
首先我们改变输入20160513072950.782000-420
to 20160513072950.782000-07:00:00
。我们通过提取后面的字符来做到这一点+
or -
, the 420
在这种情况下。
// Modify the input to replace offset as a number of minutes to the standard format, a number of hours, minutes, and seconds.
String input = "20160513072950.782000-420";
String offsetInMinutesAsString = input.substring ( 22 );
将其转换为long
,并创建一个LocalTime
对象,以便我们可以生成格式为的字符串HH:mm:ss
.
long offsetInMinutes = Long.parseLong ( offsetInMinutesAsString );
LocalTime offsetAsLocalTime = LocalTime.MIN.plusMinutes ( offsetInMinutes );
String offsetAsString = offsetAsLocalTime.format ( DateTimeFormatter.ISO_LOCAL_TIME );
将这些尾随字符替换为我们生成的字符串。
String inputModified = ( input.substring ( 0 , 22 ) + offsetAsString );
将字符串解析为日期时间对象
定义一个自定义格式模式通过它将该字符串解析为OffsetDateTime object.
// Parse the modified input as an OffsetDateTime.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyyyMMddHHmmss.SSSSSSZZZZZ" , Locale.US );
OffsetDateTime odt = OffsetDateTime.parse ( inputModified , formatter );
转储到控制台。
System.out.println ( "input: " + input + " | inputModified: " + inputModified + " | odt: " + odt );
输入:20160513072950.782000-420 |输入修改:20160513072950.782000-07:00:00 | ODT: 2016-05-13T07:29:50.782-07:00
Convert
我强烈建议避免使用旧的日期时间类。但如果你必须使用java.util.Date
对象与旧的日期时间代码进行互操作,您可以进行转换。
寻找添加到旧类中的新方法以进行转换。对于此转换,我们使用java.util.Date.from。我们需要为该转换方法提供一个Instant对象,UTC 时间轴上的一个时刻,分辨率为纳秒。我们可以从我们的OffsetDateTime
.
Instant instant = odt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant );
有关转换的更多信息,包括漂亮的图表,请参阅我的答案到另一个问题。请记住,我们仅与与 UTC 的偏移量在我们的输入字符串和我们的OffsetDateTime
,不是完整的时区。 A时区是一个偏移量plus处理夏令时 (DST) 等异常的规则。这俩Instant
和java.util.Date
采用 UTC(偏移量为零)。