我想在运行时更改Java Calendar实例中的TIMEZONE值。 我在下面试过。但两种情况下的输出都相同:
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
System.out.println(cSchedStartCal.getTime().getTime());
cSchedStartCal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
System.out.println(cSchedStartCal.getTime().getTime());
输出:
1353402486773
1353402486773
我也试过了,但输出仍然相同:
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
System.out.println(cSchedStartCal.getTime());
Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
cSchedStartCal1.setTime(cSchedStartCal.getTime());
System.out.println(cSchedStartCal.getTime());
在API中,我看到了以下评论,但我无法理解它:
* calls: cal.setTimeZone(EST); cal.set(HOUR, 1); cal.setTimeZone(PST).
* Is cal set to 1 o'clock EST or 1 o'clock PST? Answer: PST. More
* generally, a call to setTimeZone() affects calls to set() BEFORE AND
* AFTER it up to the next call to complete().
你能帮我吗?
一种可能的解决方案:
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
long gmtTime = cSchedStartCal.getTime().getTime();
long timezoneAlteredTime = gmtTime + TimeZone.getTimeZone("Asia/Calcutta").getRawOffset();
Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
cSchedStartCal1.setTimeInMillis(timezoneAlteredTime);
此解决方案可以吗?
答案 0 :(得分:45)
在Java中,日期在内部以UTC毫秒为单位表示时间(因此不考虑时区,这就是为什么你得到相同的结果,因为getTime()
给你提到的毫秒数。)
在您的解决方案中:
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
long gmtTime = cSchedStartCal.getTime().getTime();
long timezoneAlteredTime = gmtTime + TimeZone.getTimeZone("Asia/Calcutta").getRawOffset();
Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
cSchedStartCal1.setTimeInMillis(timezoneAlteredTime);
您只需将GMT的偏移量添加到指定的时区(在您的示例中为“Asia / Calcutta”),以毫秒为单位,因此这应该可以正常工作。
另一种可能的解决方案是利用Calendar
类的静态字段:
//instantiates a calendar using the current time in the specified timezone
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
//change the timezone
cSchedStartCal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
//get the current hour of the day in the new timezone
cSchedStartCal.get(Calendar.HOUR_OF_DAY);
有关更深入的解释,请参阅stackoverflow.com/questions/7695859/。
答案 1 :(得分:15)
类Date/Timestamp
表示特定时刻,精确到毫秒,自1970年1月1日00:00:00 GMT。因此,无论时区如何,这个时间差(从纪元到当前时间)在世界各地的所有计算机中都是相同的。
Date/Timestamp
不知道给定时间是在哪个时区。
如果我们想要基于时区的时间,我们应该选择java中的Calendar或SimpleDateFormat类。
如果您尝试使用toString()
打印日期/时间戳对象,它将使用您机器的默认时区转换并打印时间。
所以我们可以说(日期/时间戳).getTime()对象将始终具有UTC(以毫秒为单位的时间)
总结Date.getTime()
将给出UTC时间,但toString()
是特定于语言环境的时区,而不是UTC。
以下代码为您提供了指定时区的日期(以毫秒为单位的时间)。这里唯一的问题是你必须以字符串格式给出日期。
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
dateFormatLocal.setTimeZone(timeZone);
java.util.Date parsedDate = dateFormatLocal.parse(date);
使用dateFormat.format
将输入日期(始终为UTC),时区和返回日期作为字符串。
如果您打印parsedDate
对象,则时间将为默认时区。
但您可以将UTC时间存储在DB中,如下所示。
Calendar calGMT = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Timestamp tsSchedStartTime = new Timestamp (parsedDate.getTime());
if (tsSchedStartTime != null) {
stmt.setTimestamp(11, tsSchedStartTime, calGMT );
} else {
stmt.setNull(11, java.sql.Types.DATE);
}