将Java时区强制为GMT / UTC

我需要强制任何时间相关的操作到GMT / UTC,无论在机器上设置的时区。 任何方便的方式,以便在代码?

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

谢谢!

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

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

如果您需要从数据库ResultSet检索Date / Time / Timestamp对象时设置特定的时区,请使用带有Calendar对象的getXXX方法的第二种forms:

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

或者,在PreparedStatement中设置date:

 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); 

另外如果你可以这样设置JVM时区

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

或JVM参数中的-Duser.timezone=GMT

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

-Duser.timezone=America/Los_Angeles

或者你适当的时区。 find一个时区列表certificate是有点挑战也…

这里有两个列表。

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

对我来说,只需要简单的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")); } 

然后用不同的时区格式化date。

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

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

您可以使用TimeZone.setDefault()更改时区 – 即使只是暂时的,对于某些操作。

创build一对客户端/服务器,这样在执行之后,客户端服务器发送正确的时间和date。 然后,客户端请求服务器下午格林尼治标准时间,服务器发回答案的权利。

如果您只想使用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) 

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