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)); } |
我认为这就是你要做的 - 将给定时间转换为不同的时区。为此,我认为您不需要添加/减去任何偏移量,因为您只需要在不同时区中表示相同的时间,并且
至于夏令时,
乔达时间
使用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个字母的时区代码。它们既不标准也不独特。例如,您的
java.util.GregorianCalendar允许您使用时区创建日期。不幸的是,加法和减法从那里吸了。 (你如何在Java中减去日期?)
由于您在两个时区之间进行转换,因此您还可以使用java.util.TimeZone并使用