- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用下面的代码将时间转换为有效的 UTC
import java.text.SimpleDateFormat;
import static java.util.Calendar.*
def dt = "2018-03-19T06:00:00+01:00"
def format = "yyyy-MM-dd'T'HH:mm:ssX"
TimeZone tz = TimeZone.getDefault(); //getting up local time zone
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date d = sdf.parse(dt);
TimeZone.setDefault(tz);
println d //output: 2018-03-19T05:00:00Z
println d.toTimestamp(); //Output: 2018-03-19 06:00:00.0
但是当我使用 TimeZone.setTimeZone(TimeZone.getTimeZone("UTC"));
时它就不起作用了。
它仅适用于 TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
为什么会这样?
评论后更新:输出需要使用 CET,但使用 UTC
def dt = "2018-03-19T06:00:00+01:00"
def format = "yyyy-MM-dd'T'HH:mm:ssX"
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setTimeZone(TimeZone.getTimeZone("CET"))
Date d = sdf.parse(dt);
println d
println d.toTimestamp();
输出:
Mon Mar 19 05:00:00 UTC 2018
2018-03-19 05:00:00.0
最佳答案
String dt = "2018-03-19T06:00:00+01:00";
OffsetDateTime dateTime = OffsetDateTime.parse(dt);
System.out.println(dateTime);
这打印
2018-03-19T06:00+01:00
与过时的 Date
类相反,java.time
中的 OffsetDateTime
是现代 Java 日期和时间 API,它确实包含 UTC抵消,顾名思义。我没有使用 Groovy 的经验,很抱歉不得不相信你能翻译我的 Java 代码。
如果你想确保得到一个特定的时区,而不管字符串中的偏移量是多少:
ZoneId zone = ZoneId.of("Europe/Brussels");
ZonedDateTime dateTime = OffsetDateTime.parse(dt).atZoneSameInstant(zone);
这次的结果是:
2018-03-19T06:00+01:00[Europe/Brussels]
不要依赖像 CET 这样的三个字母的时区缩写。 CET 是许多欧洲时区的标准时间一半(没有夏令时/DST 的部分)的通用名称,这些时区通常共享时间,但并不总是这样做,并且在涉及历史日期时往往不同意时间。其他三个字母的缩写是模棱两可的,因此会导致更多的困惑。始终将时区指定为地区/城市,就像我对欧洲/布鲁塞尔所做的那样。当然,选择符合您所需时区的城市。
如果您认为您需要 java.sql.Timestamp
— 您可能不需要它。如果使用 JDBC 4.2 或更高版本或类似的现代 JPA 实现,最好将 Instant
或 LocalDateTime
存储到您的数据库中。选择取决于您的确切要求和数据库列的确切数据类型。
Instant inst = dateTime.toInstant();
System.out.println(inst);
输出
2018-03-19T05:00:00Z
Instant
始终以 UTC 打印。如果没有足够新的 JDBC 驱动程序,您可以通过以下两种方式之一转换为 Timestamp
:
System.out.println(Timestamp.from(inst));
System.out.println(Timestamp.valueOf(dateTime.toLocalDateTime()));
2018-03-19 06:00:00.0
2018-03-19 06:00:00.0
因为我的时区与日期时间对象中的时区一致,所以我从两次转换中得到相同的结果。在其他时区,结果可能不同,您需要注意选择正确的结果。
当您使用 SimpleDateFormat
解析其中包含 UTC 偏移量的字符串时,它会使用该偏移量来确定时间点。在这种情况下,它不会使用您通过 setTimeZone
设置的时区。它不会将任何时区或偏移量放入它返回的 Date
中,因为 Date
不能包含时区。这只是一个时间点。
让很多人感到困惑的是 Date.toString()
的结果似乎包含时区缩写,如输出中的 UTC Mon Mar 19 05:00:00 UTC 2018
。 toString()
使用 JVM 的时区设置来生成字符串。这就是 TimeZone.setDefault()
影响您获得的输出的原因:它设置 JVM 设置,影响在同一 JVM 中运行的所有程序。它不会影响 Date
对象本身,但只会影响其 toString()
的结果。
TimeZone
、Date
和 Timestamp
类早已过时。 SimpleDateFormat
也太麻烦了。我建议你根本不要使用这些类。 java.time
更易于使用。
Oracle tutorial: Date Time解释如何使用 java.time
。
关于java - SimpleDateFormat setTimeZone 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49451976/
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
var urlsearch = "http://192.168.10.113:8080/collective-intellegence/StoreClicks?userid=" + userId +
我有一个非常奇怪的问题,过去两天一直让我抓狂。 我有一个我试图控制的串行设备(LS 100 光度计)。使用设置了正确参数的终端(白蚁),我可以发送命令(“MES”),然后是定界符(CR LF),然后我
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。 显然,当我使用 Excel 时,我不能简单地使用与可
我开发了简单的 REST API - https://github.com/pavelpetrcz/MandaysFigu - 我的问题是在本地主机上,WildFly 16 服务器的应用程序运行正常。
我遇到了奇怪的情况 - 从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django View 创建相同的对象看起来成功,但 MongoDB 中没有出现任何数据。
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航类搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与 pus
我的谷歌分析 JavaScript 事件在开发者控制台中运行得很好。 但是当从外部 js 文件包含在页面上时,它们根本不起作用。由于某种原因。 例如; 下面的内容将在包含在控制台中时运行。但当包含在单
这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它: 这是我的解决方案: 'use strict'; const zmq = require('zeromq
我正在阅读文本行,并创建其独特单词的列表(在将它们小写之后)。我可以使它与 flatMap 一起工作,但不能使它与 map 的“子”流一起工作。 flatMap 看起来更简洁和“更好”,但为什么 di
我正在编写一些 PowerShell 脚本来进行一些构建自动化。我发现 here echo $? 根据前面的语句返回真或假。我刚刚发现 echo 是 Write-Output 的别名。 写主机 $?
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我将一个工作 View Controller 类从另一个项目复制到一个新项目中。我无法在新项目中加载 View 。在旧项目中我使用了presentModalViewController。在新版本中,我
我对 javascript 很陌生,所以很难看出我哪里出错了。由于某种原因,我的功能无法正常工作。任何帮助,将不胜感激。我尝试在外部 js 文件、头部/主体中使用它们,但似乎没有任何效果。错误要么出在
我正在尝试学习Flutter中的复选框。 问题是,当我想在Scaffold(body :)中使用复选框时,它正在工作。但我想在不同的地方使用它,例如ListView中的项目。 return Cente
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我有一个组合框,其中包含一个项目,比如“a”。我想调用该组合框的 Action 监听器,仅在手动选择项目“a”完成时才调用。我也尝试过 ItemStateChanged,但它的工作原理与 Action
你能看一下照片吗?现在,一步前我执行了 this.interrupt()。您可以看到 this.isInterrupted() 为 false。我仔细观察——“这个”没有改变。它具有相同的 ID (1
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我正在尝试在我的网站上设置一个联系表单,当有人点击发送时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的工作表中不断收到此错误: Illuminate\Database\El
我是一名优秀的程序员,十分优秀!