设置时区并不能满足我的期望

时间:2013-08-06 13:34:22

标签: java timezone

我必须说使用时区是我的克星!

在我的数据库(PostGres)中,我有一个“没有时间的时间戳”区域的字段。

我保存的值是UTC时间。

我想要做的是根据我机器的默认时区显示值。

因此,当我从数据库中检索值时,我首先必须“说”这是UTC时间,因此我将其时区设置为UTC:

private Date lastUpdateToUTC( Date myDate)
{
    if ( myDate!= null )
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
        dateFormat.setTimeZone( TimeZone.getTimeZone( "UTC" ) );

        System.out.println("orig: " + dateFormat.format(myDate));

        try
        {
            Date convertedDate = dateFormat.parse( dateFormat.format( myDate) );

            dateFormat.setTimeZone( TimeZone.getDefault( ) );

            System.out.println("converted: " + dateFormat.format(convertedDate));

            return dateFormat.parse( dateFormat.format( convertedDate ) );
            ....

我想myDate是2013-08-05 10:44:08。

我期待的是第一个输出是2013-08-05 10:44:08和第二个2013-08-05 12:44:08。

相反,我得到2013-08-05 08:44:08和2013-08-05 10:44:08 ......

我的推理错误在哪里? 我该怎么办才能得到我所期待的东西?

2 个答案:

答案 0 :(得分:1)

您当前的当地时区为GMT+2,这就是第一个输出为T+2小时的原因。 为了以UTC时区打印日期,由于+2小时偏移,日期将减去2小时。

intput: 2013-08-05 10:44:08      // GMT+2 timezone
orig: 2013-08-05 08:44:08        // UTC timezone
converted: 2013-08-05 10:44:08   // default timezone: GMT+2 timezone

您可以使用dateFormat.getTimeZone()打印当前本地时区以了解偏移量。
以我自己为例,我的本地时区为GMT+8,偏移量为8 * 60 * 60 * 1000 = 28800000毫秒。

System.out.println("My Current Timezone: " + dateFormat.getTimeZone());
// My Current Timezone: sun.util.calendar.ZoneInfo[id="Asia/Taipei",offset=28800000,dstSavings=0,useDaylight=false,transitions=42,lastRule=null]

答案 1 :(得分:1)

java.util.Date不支持时区。

对于第一个输出,将dateFormat设置为UTC。当您提供Date to dateFormat时,它会将其转换为UTC。它无法知道你的日期是哪个时区,它假定它是当地时区。所以看起来在你的情况下它是GMT + 2,dateFormat减去2使其成为UTC。 然后你做格式化 - 解析,这不应该有任何影响,然后你将时区改为你当地的时区并打印你的原始日期值。 (这次没有转换)。