0

我在 IST 中有一个日期时间。如果java中给定的日期时间有夏令时,我想根据输入考虑夏令时将其转换为美国时区。这是我试过的

function convert(Date dt,int toTimeZoneId){
Calendar cal = Calendar.getInstance();
cal.setTime(dt); // Geting time in IST

//Converted to GMT and set in cal

switch(toTimeZoneId){
    case 1: tzTarget = TimeZone.getTimeZone("America/Adak"); 
        offset = -10;
        break;
    case 2: tzTarget = TimeZone.getTimeZone("America/Anchorage"); 
        offset = -9;
        break;
    case 3: tzTarget = TimeZone.getTimeZone("America/Los_Angeles"); 
        offset = -8;
        break;

    case 4: tzTarget = TimeZone.getTimeZone("America/Denver");
        offset = -7;
        break;
    case 5: tzTarget = TimeZone.getTimeZone("America/Chicago");
        offset = -6;
        break;
    case 6: tzTarget = TimeZone.getTimeZone("America/New_York");
        offset = -5;
        break;
}
//converting from GMT to US timezones based on offset and dst
cal.setTimeZone(tzTarget);
dst = tzTarget.getDSTSavings();
dst = dst/3600000;
offset = offset + dst;
cal.add(Calendar.HOUR, offset);

Date date = cal.getTime();

System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));

}

4

3 回答 3

1

要将给定的日期转换为不同的时区,您需要创建具有适当时区的日期格式化程序。日期实例只是相对于纪元的长值;它没有时区信息。所以我们没有将它转换为不同的时区,我们只是在不同的时区中表示它。这就是为什么当我们想要创建日期实例的字符串表示时需要时区信息的原因。

这里有一些代码来说明上述情况。我刚刚将时区添加到您的日期格式字符串中以使事情变得清晰。

/*
 * Converts a specified time to different time zones
 */
public void convert(Date dt) {
    // This prints: Date with default formatter: 2013-03-14 22:00:12 PDT
    // As my machine is in PDT time zone
    System.out.println("Date with default formatter: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").format(dt));

    // This prints: Date with IST time zone formatter: 2013-03-15 10:30:12 GMT+05:30
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
    TimeZone tz = TimeZone.getTimeZone("GMT+0530");
    sdf.setTimeZone(tz);
    String dateIST = sdf.format(dt);
    System.out.println("Date with IST time zone formatter: " + dateIST);

    // This prints: Date CST time zone formatter: 2013-03-15 00:00:12 CDT        
    tz = TimeZone.getTimeZone("CST");
    sdf.setTimeZone(tz);
    System.out.println("Date CST time zone formatter: " + sdf.format(dt));
}

我认为这就是你想要做的 - 将给定时间转换为不同的时区。为此,我认为您不需要添加/减去任何偏移量,因为您只希望在不同的时区表示相同TimeZone的时间,并且实例应该能够在格式化期间处理该问题。

至于夏令时,TimeZone应该也能处理好。如果您在我的示例代码中注意到,我曾经CST创建TimeZone实例并且CST是“GMT -06 小时”。但它给出的输出是 in CDT,即“GMT -05 hours”,因为这个时区实例使用夏令时。因此,通过使用适当的时区,您也应该能够处理夏令时。

于 2013-03-14T12:52:58.130 回答
0

java.util.GregorianCalendar允许您创建带有时区的日期。不幸的是,加法和减法从那里很糟糕。(你如何在 Java 中减去日期?

由于您在两个时区之间进行转换,您还可以使用java.util.TimeZone并使用tz1.getOffset(date) - tz2.getOffset(date). 做减法时注意排序。

于 2013-03-14T12:10:25.103 回答
0

乔达时间

使用Joda-Time使这变得容易得多。或者尝试 Java 8 中的新 java.time 包。

这是一些使用 Joda-Time 2.3 的示例代码。搜索 StackOverflow 以获取更多示例。

印度时间……</p>

DateTimeZone timeZone_India = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( date, timeZone_India );

正在调整与纽约时间相同的显示时刻……</p>

DateTimeZone timeZone_NewYork = DateTimeZone.forID( "America/New_York" );
DateTime dateTimeNewYork = dateTimeIndia.withZone( timeZone_NewYork ); // Same moment, different wall-clock time.

仍然是同一时刻,但在UTC(无时区偏移)。

DateTime dateTimeUtc = dateTimeIndia.withZone( DateTimeZone.UTC );

使用正确的时区名称

避免使用 3-4 个字母的时区代码。它们既不是标准化的,也不是唯一的。IST例如,您可以表示爱尔兰标准时间或印度标准时间。使用正确的时区名称

于 2014-03-24T07:34:49.147 回答