Java – 存储GMT时间

  1. 我的服务器有GMT + 7,所以如果我移动到另一台服务器有另一个GMT时区,存储在db中的所有日期都不正确?
  2. 是Q1是正确的,我将如何在GMT + 0时区存储日期并将其显示在每个成员选择的自定义GMT时区中
  3. 我如何在java中使用GMT + 0获取日期

1)引用javadocs,Java毫秒时间戳是

当前时间与UTC时间1970年1月1日午夜之间的差异,以毫秒为单位。

因此,由于时间戳为UTC / GMT,如果将其存储在数据库中,则无论服务器的时区如何,此日期都是正确的。

2)根据时区格式化显示的时间戳将是正确的方法。

3)创建一个新的java.util.Date实例并调用getTime()将获得Java中GMT + 0的时间戳。

要添加到标记点,一旦有了java.util.Date,就可以将其“转换”为任何时区(由用户选择)。 这是Groovy中的代码示例(将在Java中使用轻微的mod):

// This is a test to prove that in Java, you can create ONE java.util.Date // and easily re-display it in different TimeZones fmtStr = "MM/dd/yyyy hh:mm aa zzz" myDate = new java.util.Date() sdf = new java.text.SimpleDateFormat(fmtStr) // Default TimeZone println "Date formatted with default TimeZone: " + sdf.format(myDate) // GMT sdf.setTimeZone(TimeZone.getTimeZone("GMT")) println "Date formatted with GMT TimeZone: " + sdf.format(myDate) // America/New_York sdf.setTimeZone(TimeZone.getTimeZone("America/New_York")) println "Date formatted with America/New_York TimeZone: " + sdf.format(myDate) // PST sdf.setTimeZone(TimeZone.getTimeZone("PST")) println "Date formatted with PST TimeZone: " + sdf.format(myDate) 

默认情况下,当您在当前时区的java中获取日期时,您可以使用TimeZone类来获取系统时间运行的时区。大多数数据库支持日期可以与时区一起存储,这可能是正确的方式要做到这一点,但确切的格式可能取决于您使用的数据库。

我建议您仅将Date用作“持有者”,并建议您使用Calendar实例。 要在GMT时区中获取日历,请使用以下命令:

 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+00")) 

当您处理时间和日期时,日历将提供很多好处。 例如,为此添加一小时很简单:

 cal.add(Calendar.HOUR, 1); 

最后,当你需要一个日期时,你只需使用它:

 Date date = cal.getTime(); 

对于Q3,请考虑使用ZonedDateTime类。