[英]Convert String in EST to Date in PST
我尝试了以下方法,并在Web上搜索以找到解决方案,但是没有运气:寻找将IST中的String转换为PST的解决方案:
String string = new Date().toString();
System.out.println(string);
SimpleDateFormat dt = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
dt.setTimeZone(TimeZone.getTimeZone("PST"));
Date D = dt.parse(string);
System.out.println(""+ D);
即使当我将时区设置为PST时,我仍然看到IST的输出是这里的输出:
IST 2017年4月18日18:58:09星期二IST 2017年2月18日星期二
我在这里尝试了另一个选项,我看到它甚至显示了PST中的时间,但是我在下面的输出中看到它有点混乱:
public static Date convertFromOneTimeZoneToOhter(Date dt,String from,String to ) {
TimeZone fromTimezone =TimeZone.getTimeZone(from);//get Timezone object
TimeZone toTimezone=TimeZone.getTimeZone(to);
long fromOffset = fromTimezone.getOffset(dt.getTime());//get offset
long toOffset = toTimezone.getOffset(dt.getTime());
//calculate offset difference and calculate the actual time
long convertedTime = dt.getTime() - (fromOffset - toOffset);
Date d2 = new Date(convertedTime);
return d2;
}
输出:转换日期:2017年4月18日星期二06:28:09
有人可以帮忙吗:我发现了很多将IST日期时间转换为PST字符串而不是IST / EST日期转换为PST日期的解决方案。 正如我上面提到的,我们可以格式化为字符串,但是我正在寻找一个转换回日期的示例
您应该研究Java 8的新Date API,该API可直接处理时区
// Get the current date and time
ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");
System.out.println("date1: " + date1);
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("Zoned Date Time: " + zonedDateTime);
ZoneId id = ZoneId.of("Europe/Paris");
System.out.println("ZoneId: " + id);
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("CurrentZone: " + currentZone);
版画:
date1: 2007-12-03T10:15:30+05:00[Asia/Karachi]
Zoned Date Time: 2017-04-18T09:52:09.045-04:00[America/New_York]
ZoneId: Europe/Paris
CurrentZone: America/New_York
由于这里的一些读者将使用Java 8或更高版本,而某些Java 7或更早的版本,因此我将同时对待这两种情况。
如果可以,我建议您使用Java 8中引入的java.time
类:
ZoneId targetTz = ZoneId.of("America/Los_Angeles");
String string = "Tue Apr 18 18:58:09 +0300 2017";
DateTimeFormatter format = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss ZZZ uuuu",
Locale.ENGLISH);
ZonedDateTime sourceTime = ZonedDateTime.parse(string, format);
ZonedDateTime targetTime = sourceTime.withZoneSameInstant(targetTz);
String result = targetTime.format(format);
System.out.println(result);
打印:
Tue Apr 18 08:58:09 -0700 2017
您说您想要一个PST日期,而这正是ZonedDateTime
给您的:日期和时间以及时区信息。
在示例中,我在字符串中给出了区域偏移+0300
(对应于以色列夏令时)。 我知道对您来说时区的分配并不重要。 我想避免使用IST
这样的三个字母和四个字母的时区缩写。 IST
不仅可以表示爱尔兰标准时间,以色列标准时间或印度标准时间。 此外,我还注意到java.time
类将18:58:09 IST转换为IDT 18:58:09 IDT(UTC + 3),因为它知道以色列4月18日在DST。 我返回到下面的SimpleDateFormat
更直接地将IST转换为IST
并将18:58:09 IST解释为18:58:09 +0200,这是在UTC之后的1小时。
如果需要,可以将java.time
类与Java 1.7一起使用。 您可以在ThreeTen Backport中获得它们。
如果您不想使用java.time
,那么在这种情况下,使用Java 1.0和1.1中过时的类的方法也没有什么不同,只有我不能给您您要求的PST日期:
TimeZone targetTz = TimeZone.getTimeZone("America/Los_Angeles");
String string = "Tue Apr 18 18:58:09 +0300 2017";
SimpleDateFormat dt = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy", Locale.ENGLISH);
Date d = dt.parse(string);
dt.setTimeZone(targetTz);
String result = dt.format(d);
System.out.println(result);
它输出与上面相同的结果。 但是,您注意到只有一个Date
对象。 Date
对象不能保存任何时区信息,因此,如果需要此信息,则必须将targetTz
对象与d
一起使用。 常见的误解是, Date
对象中应该有一个时区,这可能是因为它的toString()
打印了一个时区。 但是,这始终是JVM的默认时区,并且并非来自Date
对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.