考虑到java中的夏令时,将IST转换为美国时区

Convert IST to US timezones considering the daylight saving time in java

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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));

}


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * 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小时"。但它提供的输出是CDT,即"GMT -05小时",因为此时区实例使用夏令时。因此,通过使用适当的时区,您也应该能够处理夏令时。


乔达时间

使用Joda-Time可以更轻松。或者在Java 8中尝试新的java.time包。

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

印度时间......

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

调整与纽约时间相同的显示时刻......

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

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

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

使用适当的时区名称

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


java.util.GregorianCalendar允许您使用时区创建日期。不幸的是,加法和减法从那里吸了。 (你如何在Java中减去日期?)

由于您在两个时区之间进行转换,因此您还可以使用java.util.TimeZone并使用tz1.getOffset(date) - tz2.getOffset(date)的差异。在做减法时要记住排序。