如何更改TIMEZONE为java.util.Calendar中/日(How to change T

2019-06-21 05:52发布

我想在运行时在Java日历实例来改变区值。 我试过下面。 但输出是在这两种情况是相同的:

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

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

这是解决好吗?

Answer 1:

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

你只需要添加的偏移,从格林尼治标准时间以毫秒为单位指定的时区(“亚洲/加尔各答”在你的例子),所以这应该很好地工作。

另一种可能的解决办法是利用的静态字段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/进行更深入的解释。



Answer 2:

  1. 该类Date/Timestamp表示特定的瞬间,精确到毫秒,自1970年1月1日,00:00:00 GMT。 所以这个时间差(从历元至当前时间)将与时区无关全世界所有的计算机一样。

  2. Date/Timestamp不知道该给定的时间是在其时区。

  3. 如果我们要根据时区的时间,我们应该去Java中的日历或SimpleDateFormat类。

  4. 如果您尝试打印日期/时间戳使用对象toString()它会转换,并与机器的默认时区打印的时间。

  5. 因此,我们可以说(日期/时间戳).getTime()对象总是有UTC(时间以毫秒为单位)

  6. 总之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),时区和返回日期字符串。

如何存储在DB UTC / GMT时间:

如果打印parsedDate对象,时间将在默认时区。 但是你可以在数据库存储UTC时间如下图所示。

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


文章来源: How to change TIMEZONE for a java.util.Calendar/Date