转换为GMT在DST期间出现问题

时间:2013-04-18 07:31:22

标签: java

我在现有应用程序中遇到问题,即员工(使用时钟应用程序从他的组织/商店)输入的时间首先转换为GMT,然后存储在数据库中。并且为了显示回来,GMT中的时间被转换回存储本地时区并显示。在大多数情况下,这种方法很好,但是当时区移动到DST时反之亦然。

让我更具体一点。假设商店的标准时区为GMT-8,员工在早上08:00 AM进行打孔,因此时间转换为GMT,给出16:00,然后存储在DB中。 转换过程首先将此08:00 AM转换为以某种方式存储的本地时间 欧洲中部时间17:00然后这个17:00 CET转换为格林威治标准时间16:00 CET。

但是,如果我们举一个3月31日的例子,当DST发生在凌晨02:00变为03:00 AM。假设emplyoee在18:00(3月30日)拳击,它在第一次转换到本地时返回我在CEST上午04:00,然后当我将其转换为GMT时,它给出了03:00 CEST。因此,在将其转换回来时,这将给出19:00这是不正确的。 设计说当地时间转换为UTC然后存储在数据库中但是如果它仍然是UTC那么它应该存储02:00 AM而不是03:00 AM因为GMT / UTC没有DST。

用于进行转换的代码是:

第1步

final Date localPunchDateTime = R3ValConverter.convertFromTimeZone(teData.m_dtTm,  
                                               TimeZone.getTimeZone("GMT-8"));

第2步

teData.m_dtTm = R3ValConverter.convertToGMT( localPunchDateTime );

R3ValConverter.java

public static Date convertFromTimeZone(final Date dtSrc, final TimeZone tzSrc)
    {

        final SISDateTime dtTmTemp = new SISDateTime(dtSrc, TimeZone.getDefault());
        final SISDateTime dtTmSrc = new SISDateTime( dtTmTemp.getYear(), dtTmTemp.getMonth(), 
                                                     dtTmTemp.getDate(), dtTmTemp.getHour(), 
                                                     dtTmTemp.getMinute(), dtTmTemp.getSecond(), 
                                                     tzSrc );

        return dtTmSrc.toDate();                                                       
    }

SISDateTime

GregorianCalendar m_cal;

public SISDateTime(Date dt, TimeZone tz) throws SISDateTimeException
    {

        m_cal = new GregorianCalendar(tz);
        m_cal.setTime(dt);
        resetMillis();
    }

另一个SISDateTime方法也使用相同的GregorianCalendar。

我真的很感谢这方面的任何帮助。我在这里假设我们在第一步中遇到了一些问题,但目前还不知道有什么好的解决方案。

1 个答案:

答案 0 :(得分:0)

您必须在数据库中存储从本地时间到UTC的UTC +当前偏移量(以秒为单位)。 因此,如果你想保留当地时间,你总是需要一对(Utc时间,偏移)

然后使用TimezoneWithOffsetFromGMT(或类似名称)