我有一个安卓应用程序,它从我的服务器接收这种格式的字符串:"MM-dd-yyyy HH:mm:ss"。我想将此字符串转换为以 UTC 为时区的 Date 对象,因为字符串中的时间是 UTC。我已经检查了几个类似的问题,但没有找到答案
这是我目前使用的:
SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
Date date = new Date();
try {
date = format.parse(itemContent [3]);
entity.setValidTill(date);
}catch (Exception e){
}
但是当我使用 Log 打印该日期时,它的作用是将其显示为:
周日 8月 27 15:00:00GMT+04:00 2017
我希望它是:
周日 8月 2715:00:00 GMT 00:00 2017
所以这里是主要问题 如何使用格式为上述格式的字符串获取 UTC 的日期时间?
编辑:
把它放在一个更好的上下文中。我试图让用户看到当前日期时间和保存在服务器中的日期时间之间的差异。所以我的解决方案是为用户获取格林尼治标准时间并与服务器时间(即格林威治标准时间(进行比较,这样每个人都能看到相同的差异,无论他们的时区如何。使用C#,您可以获得DateTime.UtcNow,而使用Java我找不到替代方案。
简而言之,因为您的问题实际上是许多其他问题的副本......
您正在使用麻烦的旧日期时间类,这些类现在是遗留的,被java.time类所取代。
将输入字符串解析为LocalDateTime
,因为它缺少任何与 UTC 或时区偏移的指示符。
定义格式化程序以解析输入字符串。
String input = "08-27-2017 15:00:00" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString((: 2017-08-27T15:00
LocalDateTime
不是时间轴上的一个时刻,只是对一系列可能时刻的粗略想法。没有偏移量(或时区(的上下文就没有意义。
如果确定输入用于 UTC,请为OffsetDateTime
分配常量ZoneOffset.UTC
。
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
odt.toString((: 2017-08-27T15:00Z
若要计算该时刻与当前时刻之间的增量,请使用Period
类来获得较粗的粒度,或使用Duration
类来获得更精细的粒度。这两个类都生成标准 ISO 8601 格式的字符串PnYnMnDTnHnMnS
。
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC ) ;
Duration d = Duration.between( odt , now ) ;
now.toString((: 2017-08-27T21:16:56.396Z
d.toString((: PT6H16M56.396S
查看此代码在 IdeOne.com 实时运行。
在上面看到的标准字符串中,Z
是Zulu
的缩写,表示 UTC。
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧传统日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。
您可以直接与数据库交换java.time对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要java.sql.*
类。
从哪里获得java.time类?
Java SE 8、Java SE- 9、Java SE 10及更高版本
- 内置。
- 具有捆绑实现的标准 Java API 的一部分。
- Java 9添加了一些小功能和修复。
Java SE 6 和 Java SE 7 大部分 - java.time 功能在ThreeTen-Backport中向后移植到 Java 6 和 7。
Android- 更高版本的 java.time 类的 Android 捆绑实现。
- 对于早期的Android(<26(,ThreeTenABP项目适应了ThreeTen-Backport(如上所述(。请参阅如何使用ThreeTenABP...。
只需在代码的第一行下添加此代码:
format.setTimeZone(TimeZone.getTimeZone("UTC"));