强制Java时区为GMT / UTC

问题描述 投票:81回答:10

无论机器上设置的时区如何,我都需要强制任何与GMT / UTC相关的操作。在代码中有任何方便的方法吗?

为了澄清,我正在使用数据库服务器时间进行所有操作,但它是根据本地时区格式化的。

谢谢!

java timezone utc gmt
10个回答
109
投票

OP回答了这个问题,以更改正在运行的JVM的单个实例的默认时区,设置user.timezone系统属性:

java -Duser.timezone=GMT ... <main-class>

如果您需要在从数据库ResultSet检索日期/时间/时间戳对象时设置特定时区,请使用带有getXXX对象的Calendar方法的第二种形式:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ResultSet rs = ...;
while (rs.next()) {
    Date dateValue = rs.getDate("DateColumn", tzCal);
    // Other fields and calculations
}

或者,在PreparedStatement中设置日期:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
PreparedStatement ps = conn.createPreparedStatement("update ...");
ps.setDate("DateColumn", dateValue, tzCal);
// Other assignments
ps.executeUpdate();

这些将确保当数据库列不保留时区信息时,存储在数据库中的值是一致的。

java.util.Datejava.sql.Date类以UTC格式存储实际时间(毫秒)。要将输出格式化为另一个时区,请使用SimpleDateFormat。您还可以使用Calendar对象将时区与值相关联:

TimeZone tz = TimeZone.getTimeZone("<local-time-zone>");
//...
Date dateValue = rs.getDate("DateColumn");
Calendar calValue = Calendar.getInstance(tz);
calValue.setTime(dateValue);

有用的参考

https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377

https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html


-5
投票

如果您希望仅使用intiger获得GMT时间:var currentTime = new Date(); var currentYear ='2010'var currentMonth = 10; var currentDay ='30'var currentHours ='20'var currentMinutes ='20'var currentSeconds ='00'var currentMilliseconds = '00'

currentTime.setFullYear(currentYear);
currentTime.setMonth((currentMonth-1)); //0is January
currentTime.setDate(currentDay);  
currentTime.setHours(currentHours);
currentTime.setMinutes(currentMinutes);
currentTime.setSeconds(currentSeconds);
currentTime.setMilliseconds(currentMilliseconds);

var currentTimezone = currentTime.getTimezoneOffset();
currentTimezone = (currentTimezone/60) * -1;
var gmt ="";
if (currentTimezone !== 0) {
  gmt += currentTimezone > 0 ? ' +' : ' ';
  gmt += currentTimezone;
}
alert(gmt)

20
投票

此外,如果您可以这种方式设置JVM时区

System.setProperty("user.timezone", "EST");

或者JVM中的-Duser.timezone=GMT


10
投票

我不得不为Windows 2003 Server设置JVM时区,因为它总是为新的Date()返回GMT;

-Duser.timezone=America/Los_Angeles

或者你适当的时区。找到时区列表证明也有点挑战......

这是两个清单;

http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm


8
投票

对我来说,只需快速SimpleDateFormat,

  private static final SimpleDateFormat GMT = new SimpleDateFormat("yyyy-MM-dd");
  private static final SimpleDateFormat SYD = new SimpleDateFormat("yyyy-MM-dd");
  static {
      GMT.setTimeZone(TimeZone.getTimeZone("GMT"));
    SYD.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
  }

然后使用不同的时区格式化日期。


6
投票

我将以原始形式(长时间戳或java的日期)从DB中检索时间,然后使用SimpleDateFormat对其进行格式化,或使用Calendar来操作它。在这两种情况下,您应该在使用之前设置对象的时区。

有关详细信息,请参阅SimpleDateFormat.setTimeZone(..)Calendar.setTimeZone(..)


4
投票

您可以使用TimeZone.setDefault()更改时区:

TimeZone.setDefault(TimeZone.getTimeZone("GMT"))

1
投票

创建一对客户端/服务器,以便在执行后,客户端服务器发送正确的时间和日期。然后,客户端询问服务器pm GMT,服务器发送回答权。


1
投票

哇。我知道这是一个古老的线程,但我可以说的是不要在任何用户级代码中调用TimeZone.setDefault()。这总是为整个JVM设置时区,几乎总是一个非常糟糕的主意。学习使用joda.time库或Java 8中新的DateTime类,它与joda.time库非常相似。


1
投票

使用系统属性:

-Duser.timezone=UTC
© www.soinside.com 2019 - 2024. All rights reserved.