如何使用UTC / GMT时区将字符串转换为日期

时间:2017-08-27 14:16:52

标签: java android

我有一个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我找不到替代

2 个答案:

答案 0 :(得分:1)

简而言之,因为你的问题实际上与许多其他问题重复......

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

将输入字符串解析为LocalDateTime,因为它缺少offset-from-UTCtime 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

在上面看到的标准字符串中,ZZulu的缩写,表示UTC。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance 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"));