我必须说使用时区是我的克星!
在我的数据库(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 ......
我的推理错误在哪里? 我该怎么办才能得到我所期待的东西?
答案 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。 然后你做格式化 - 解析,这不应该有任何影响,然后你将时区改为你当地的时区并打印你的原始日期值。 (这次没有转换)。