我有一个Android应用程序,它接收这种格式的字符串:“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打印日期时它的作用是显示为:
Sun Aug 27 15:00:00 GMT + 04:00 2017
我希望它是:
Sun Aug 27 15:00:00 GMT 00:00 2017
所以这里是如何使用格式如上的字符串获取UTC的DateTime的主要问题?
编辑:
把它放在更好的环境中。我试图让用户看到当前日期时间和时间之间的差异;保存在服务器中的日期时间。所以我的解决方案是为用户提供gmt时间&与服务器时间(即gmt)进行比较,因此无论时区如何,每个人都会看到相同的差异。使用C#,你可以获得DateTime.UtcNow而使用java我找不到替代
答案 0 :(得分:1)
简而言之,因为你的问题实际上与许多其他问题重复......
你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。
将输入字符串解析为LocalDateTime
,因为它缺少offset-from-UTC或time zone的任何指标。
定义一个格式化程序来解析输入字符串。
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的,请为ZoneOffset.UTC
分配常量OffsetDateTime
。
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
odt.toString():2017-08-27T15:00Z
要计算该时刻与当前时刻之间的增量,请在您的时间范围内使用Period
类获得更粗略的粒度,或使用Duration
获得更精细的粒度。这两个类都以PnYnMnDTnHnMnS
的标准ISO 8601格式生成字符串。
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC ) ;
Duration d = Duration.between( odt , now ) ;
now.toString():2017-08-27T21:16:56.396Z
d.toString():PT6H16M56.396S
请参阅此code run live at IdeOne.com。
在上面看到的标准字符串中,Z
是Zulu
的缩写,表示UTC。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
答案 1 :(得分:0)
只需在代码的第一行添加此代码:
format.setTimeZone(TimeZone.getTimeZone("UTC"));