我在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));
}
要将给定的日期转换为不同的时区,需要创建具有适当时区的日期格式化程序。date实例只是一个相对于epoch的长值;它没有时区信息。所以我们没有把它转换成不同的时区,我们只是用不同的时区表示它。这就是为什么当我们想要创建日期实例的字符串表示时需要时区信息的原因。
下面是一些代码来说明上面的内容。我刚刚在你的日期格式字符串中添加了时区,以使事情更清楚。/*
* 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 hours",因为这个时区实例使用夏令时。因此,通过使用适当的时区,您应该能够处理夏令时。
java.util。GregorianCalendar允许您创建带有时区的日期。不幸的是,加法和减法都很糟糕。(如何在Java中减去日期?)
由于要在两个时区之间进行转换,因此还可以使用java.util.TimeZone并使用tz1.getOffset(date) - tz2.getOffset(date)
的差值。做减法时注意顺序
Joda-Time
使用Joda-Time使这更容易。或者试试新的java。
下面是一些使用Joda-Time 2.3的示例代码。搜索StackOverflow获取更多示例。
印度……
DateTimeZone timeZone_India = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( date, timeZone_India );
调整与纽约时间显示相同的时刻…
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
可以表示爱尔兰标准时间或印度标准时间。使用合适的时区名称