java - 如何将字符串转换为 UTC/GMT 时区的日期

标签 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 的日期时间?

编辑:

把它放在一个更好的上下文中。我试图让用户看到当前日期时间与服务器中保存的日期时间之间的差异。所以我的解决方案是为用户获取格林威治标准时间并与服务器时间(即格林尼治标准时间)进行比较,这样每个人都会看到相同的差异,无论他们的时区如何。使用 C# 你可以获得 DateTime.UtcNow 而使用 java 我找不到替代方案

最佳答案

简单地说,因为您的问题实际上与许多其他问题重复......

您正在使用麻烦的旧日期时间类,这些类现在已被遗留,并被 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,请为 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

查看此code run live at IdeOne.com .

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

<小时/>

关于java.time

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类?

关于java - 如何将字符串转换为 UTC/GMT 时区的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45905938/

相关文章:

java - Android应用程序与rest api php codeigniter管理面板

java - Intellij IDEA 不在自动完成弹出菜单中显示类导入

android - 在我选择选项卡之前加载进度条

android - 在 Staggered Recyclerview 中显示类似结构的标签

java - Spring-Jdbc模板和Prepared语句

java - 重量级的java对象是否应该通过setAttribute保存在session中?这是 servlet 开发的好习惯吗?

java - RESTful Web 服务 - 资源上下文和响应问题

java - 不确定如何理解 logcat 告诉我的错误

Android游戏流行分辨率

android - 如何在 webrtc session 上传输外部视频流而不是网络摄像头?