- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这似乎是一个愚蠢的问题,但我无法理解这种令人毛骨悚然的行为。我完全知道 java Date
类没有在其中存储任何 TimeZone 信息。它只存储自 1970 年 1 月 1 日格林威治标准时间 00:00:00 以来的毫秒数
事实是,我使用的是驻留在具有 UTC 时区的服务器上的 MySql,并且我也仅在 UTC 中存储 DateTime
。如果我进行选择查询,那么我会得到这个日期 2014-01-17 16:15:49
通过使用 http://www.epochconverter.com/ 我得到了这个:
Epoch timestamp: 1389975349
Timestamp in milliseconds: 1389975349000
Human time (GMT): Fri, 17 Jan 2014 16:15:49 GMT
Human time (your time zone): Friday, January 17, 2014 9:45:49 PM
createdDate
属性,它是一个
Date
对象。我写了一个简单的代码来理解它的输出,这里是代码:
Date dt = c.getCreatedDate();
System.out.println(dt.getTime());
System.out.println(dt);
DateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm a z");
df.setTimeZone(TimeZone.getTimeZone("IST"));
System.out.println(df.format(dt));
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(df.format(dt));
1389955549000
2014-01-17 16:15:49.0
17/01/2014 04:15 PM IST
17/01/2014 10:45 AM UTC
1389955549000
放在
http://www.epochconverter.com/ 中,则会得到以下输出:
GMT: Fri, 17 Jan 2014 10:45:49 GMT
Your time zone: Friday, January 17, 2014 4:15:49 PM GMT+5.5
DateTime
存储在
UTC 数据库中,但您的系统时间或至少您的 java 应用程序时区位于其他时区(例如,IST - 印度标准时间),则 hibernate 认为存储在数据库中的
DateTime
也在 IST 中,这是是什么导致了整个问题。
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
ServletContextListener
中,它使我的应用程序时区在
UTC 中,现在 hibernate 正在按预期获取和存储日期。
最佳答案
令人困惑的问题
你的问题可以使用一些重写。If I make a select query
– 你应该解释这一点并给出准确的查询语句。
红鲱鱼
由于处理两个独立的服务器(数据库服务器、Web 应用程序服务器),每个服务器都有不同的时区设置,因此您应该更清晰地分离问题。确实,MySQL 服务器似乎只是一个红鲱鱼,分散注意力。
与其谈论无关的 MySQL 服务器,您应该测试并报告实际时间。很容易做到......只需谷歌“UTC当前时间”。
因此,老水手的格言是:使用一个或三个指南针,但永远不要使用两个。
时区
三字母时区代码已经过时,既不标准化也不唯一。例如,“IST”表示“印度标准时间”和“爱尔兰标准时间”。
使用时区名称,如 slightly outdated list 中所示。在您的情况下,+05:30,您可以使用“Asia/Kolkata”,在旧表中也称为“Asia/Calcutta”。这比 UTC/GMT 早 5.5 小时。
乔达时间
正如您所看到的,java.util.Date 和 Calendar 类是出了名的糟糕和困惑。避开它们。使用开源第三方 Joda-Time 或在 Java 8 中使用新的 java.time.* classes(受 Joda-Time 启发)。
下面的代码在美国西海岸时区的 Mac 上使用 Joda-Time 2.3 和 Java 8。
基线
让我们确定 1389975349000L ≈ 16:15 UTC ≈ 21:45 印度。
正如问题所述,这与 EpochConverter.com 一致。
// Specify a time zone rather than depend on defaults.
DateTimeZone timeZoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );
long millis = 1389975349000L;
DateTime dateTimeUtc = new DateTime( millis, DateTimeZone.UTC );
DateTime dateTimeKolkata = dateTimeUtc.toDateTime( timeZoneKolkata );
System.out.println( "millis: " + millis );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeKolkata: " + dateTimeKolkata );
millis: 1389975349000
dateTimeUtc: 2014-01-17T16:15:49.000Z
dateTimeKolkata: 2014-01-17T21:45:49.000+05:30
long mysteryMillis = 1389955549000L;
DateTime mysteryUtc = new DateTime( mysteryMillis, DateTimeZone.UTC );
DateTime mysteryKolkata = mysteryUtc.toDateTime( timeZoneKolkata );
System.out.println( "mysteryMillis: " + mysteryMillis );
System.out.println( "mysteryUtc: " + mysteryUtc );
System.out.println( "mysteryKolkata: " + mysteryKolkata );
mysteryMillis: 1389955549000
mysteryUtc: 2014-01-17T10:45:49.000Z
mysteryKolkata: 2014-01-17T16:15:49.000+05:30
toString
的实现中应用了 Java 虚拟机的默认时区。这是避免此类的众多原因之一,但可能是您问题的关键。
UTC
或
GMT
。在某些操作系统上没有这样的选择,所以选择“Atlantic/Reykjavik”作为一种解决方法,因为冰岛全年保持 UTC/GMT,没有任何夏令时废话。
TimeZone.setDefault
来设置 JVM 的默认时区(除非在最坏的情况下作为最后的手段)。设置默认值是粗鲁的,因为它会立即影响在该 JVM 中运行的所有应用程序的所有线程中的所有代码。它是不可靠的,因为任何其他代码都可以在运行时在您的应用程序上更改它。相反,
在所有日期时间代码中指定一个时区 。永远不要隐含地依赖 JVM 的当前默认值。 Joda-Time 和 java.time 都有接受时区参数的方法。因此,虽然将所有服务器计算机的主机操作系统的时区设置为 UTC 是一种很好的做法,但您永远不应该在 Java 代码中依赖它。
关于java - Hibernate 不提供 UTC 时区的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21193516/
在我的 Rails (3.0) 应用程序中,我使用助手 time_zone_select() 来使用时区。它生成时区名称,如“(GMT+01:00) Paris”... 但这些名称与 MySQL 中的
我正在解析格式为的日期: SimpleDateFormat formatter = new SimpleDateFormat("EE MMM dd HH:mm:ss Z yyyy"); 当我这样做的时
我在 Android 上使用 ACTION_TIMEZONE_CHANGED Intent 过滤器来响应时区更改。 我注意到 Jodas 当前时区此时没有更新,使用:DateTimeZone.getD
我有一个旧版 Windows 应用程序,它从数据库读取数据。其中一列是“TimeZoneInfoId”。在传统世界中,它是由另一个 Windows 应用程序编写的,因此它存储 Windows 字符串:
我是数据库开发新手,目前从事 MySQL 工作。我有一列包含美国的所有时区。我希望能够获取每行中每个时区的当前时间(只有时间,没有日期)。 时区数据如下:+05:00、-03:00 等等 这就是我尝试
我正在尝试了解 session 时区在 PostgreSQL 中的工作原理。 当我将 session 时区设置为“01:00”时,返回日期为“-01:00”。符号总是颠倒的,我不理解这种行为。 这怎么
我写入我的 mongoDB 数据库,例如开始日期,开始日期始终是一周中的星期一(我使用并且我在欧洲中部时区)。 "startDate" : ISODate("2014-12-28T23:00:00Z"
是否有详尽的 MySQL 时区列表? 似乎 MySQL 设置中 time_zone 的有效值取决于主机操作系统,但我一直无法找到可能值的列表。 我需要时间显示卡尔加里本地时间。 最佳答案 默认情况下,
我已经在 config/app.php 中配置了时区至 Europe/Lisbon . 如果我做 return date_default_timezone_get(); , 返回 Europe/Lis
我在整个脚本中广泛使用 unix 时间,通常我将时区设置如下: date_default_timezone_set('Europe/London'); 这一直工作正常,直到上周末时钟回退一个小时,我怀
我有一个字符串,2013-10-07T23:59:51.205-07:00,想将其转换为 Java 日期对象。我收到解析错误。 date = new SimpleDateFormat("yyyy-MM
如何更改日志文件名中的 log4j 时区? 我的 log4j.xml 文件:
在JAVA中,如何确定所有日期都作为GMT日期返回? 例如,即使我尝试使用GMT语言环境强制使用DateFormat,它也会应用某种逻辑来检索BST日期。 public static void mai
好吧,这是我遇到过的最奇怪的错误之一! 首先:我不是 Python 程序员,该脚本是由 friend 编写的(我认为他的大部分内容来自示例)。 该脚本的用途:将日历信息(CET 时间)从 XML 文件
我们有一个网站,目前在某个时间(由用户选择)运行拍卖,这一切都工作正常,因为当服务器到达该时间时,拍卖就会开始。然后我们必须添加时区,具体取决于用户居住的地方。然后,根据所选的下拉菜单,这将增加或减少
我陷入了这个逻辑。我正在开发一个消息调度项目,我的客户来自不同的国家。让我们考虑一下亚洲(不遵守夏令时)和美国/纽约(遵守夏令时)。 现在,我正在编写以下查询来获取距当前时间 10 分钟间隔内的时间表
我尝试返回特定时区的值,但我遇到了一些奇怪的响应行为: SELECT created_at AT TIME ZONE 'US/Pacific' - created_at, NOW() A
我正在尝试将不带时区值(例如“31.05.2015”)的字符串转换为 NSDate。 我的 DateFormatter 有什么问题?它返回日期 2015-05-31 22:00:00 +0000当我尝
我已经成功地将我的本地 tzinfo 导入到 mysql 中,我几乎已经了解了关于如何存储和使用这些数据的所有细节,除了一个字段。有一个名为 Transition_type_id 的数字字段(在表 t
为什么以下行返回的 TimeZone 显示不正确的时间: TimeZone.getTimeZone("America/Ottawa") 现在显示晚上 10:26 [亚特兰大时间现在是 6:26,Ott
我是一名优秀的程序员,十分优秀!