当前位置: 首页 > 面试题库 >

Java MySQL Timestamp时区问题

微生嘉
2023-03-14
问题内容

我有一个java.util.Date对象,我需要将其以UTC格式插入MySQL的datetime字段中。

java.util.Date date = myDateFromSomewhereElse;
PreparedStatement prep = con.prepareStatement(
    "INSERT INTO table (t1, t2) VALUES (?,?)");

java.sql.Timestamp t = new Timestamp(date.getTime());
prep.setTimestamp(1, t, Calendar.getInstance(TimeZone.getTimeZone("PST"));
prep.setTimestamp(2, t, Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(prep.toString());

这给了我准备好的SQL语句字符串:

INSERT INTO table (t1, t2) VALUES ('2012-05-09 11:37:08','2012-05-09 11:37:08');

无论我指定的时区如何,返回的时间戳都是相同的时间戳。它忽略了我指定的带有时区的Calendar对象。怎么回事,我在做什么错?


问题答案:

时区只是查看日期(这是固定时间点)的不同方式。我在这里写了一个小例子(请注意断言):

// timezone independent date (usually interpreted by the timezone of 
// the default locale of the user machine)
Date now = new Date();

// now lets get explicit with how we wish to interpret the date
Calendar london =  Calendar.getInstance(TimeZone.getTimeZone("Europe/London"));
Calendar paris = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));

// now set the same date on two different calendar instance
london.setTime(now);
paris.setTime(now);

// the time is the same
assert london.getTimeInMillis() == paris.getTimeInMillis();

// London is interpreted one hour earlier than Paris (as of post date of 9th May 2012)
String londonTime = london.get(Calendar.HOUR) + ":" + london.get(Calendar.MINUTE);
String londonTZ = london.getTimeZone().getDisplayName(london.getTimeZone().inDaylightTime(london.getTime()), TimeZone.SHORT);
System.out.println(londonTime + " " + londonTZ);

// Paris is interpreted one hour later than Paris (as of post date of 9th May 2012)
String parisTime = paris.get(Calendar.HOUR) + ":" + paris.get(Calendar.MINUTE);
String parisTZ = paris.getTimeZone().getDisplayName(paris.getTimeZone().inDaylightTime(paris.getTime()), TimeZone.SHORT);
System.out.println(parisTime + " " + parisTZ);

此代码段的输出是(结果将根据执行日期/时间而有所不同):

8:18 BST
9:18 CEST

您在问题中的摘要根本就没有关于存储日期的任何操作。通常,数据库是为本地TimeZone配置的。我建议存储一个额外的字段,该字段表示在解释日期时要使用的TimeZone。

修改日期(通常仅是固定时间点之前/之后的毫秒)并不是一个好主意,因为这将是有损的修改,在一年中的不同时间点(由于夏令时)会有不同的解释时间)。

或这样:http : //puretech.paawak.com/2010/11/02/how-
to-handle-oracle-timestamp-with-timezone-from-
java/



 类似资料:
  • 它给出了准备好的SQL语句字符串: 无论我指定的时区如何,返回的时间戳都是相同的时间戳。它忽略了我指定的带有时区的Calendar对象。这是怎么回事,我做错了什么?

  • 问题内容: 我需要一个具有日期和年份指定值的jsDate对象。我希望给我Date对象2000作为价值,但如果我的电脑的时间设定到芝加哥时区,我得到,和布宜诺斯艾利斯:。 有没有一种方法可以创建Date对象,并返回我们在构造函数中设置的日期,无论在用户计算机上设置了什么时区? 更新:我需要在另一个库中使用此Date对象(该库调用其方法,因此使用UTC getter并没有真正的帮助。 问题答案: 在J

  • 我已经尝试了所有方法来启用安装Symfony2后运行此命令的能力。 php应用程序/控制台缓存:清除--无预热或php应用程序/控制台缓存:清除 我每次都会遇到此错误: [错误异常]警告:date\u default\u timezone\u get():依赖系统的时区设置是不安全的。您需要使用日期。时区设置或date\u default\u timezone\u set()函数。如果您使用了这些

  • 我在时区面临一个问题。现在我正在从客户端保存时区,并将所有日期时间存储在UTC中。它工作正常,但当我试图将UTC的日期时间转换为CST、EST、EDT等时区后,它会显示错误的数据。 问题-假设我在美国东部夏令时晚上10点做了任何任务,并且它将在凌晨2点(按照UTC)保存在DB中,但当我尝试获取一天的数据并通过当前UTC日期时。 我的问题是,如果我试图获取一天的数据,比如从美国东部时间午夜11点到当

  • 尝试与数据库MySQL建立连接时出现此错误 与MySQL的连接是这样完成的:

  • 我还看到“cdt”快捷方式正在linux“zdump”输出中使用: ZDUMP-V美国/哈瓦那grep 2013美国/哈瓦那Sun 2013年3月10日04:59:59 2013 UTC=Sun 3月9日23:59:59 2013 CST ISDST=0 GMTOFF=-18000美国/哈瓦那Sun 2013年3月10日05:00:00 2013 UTC=Sun 2013年11月3日04:59:5