我尝试了以下方法并在Web中搜索以找到解决方案,但没有运气:寻找将IST中的字符串转换为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 这是出局:
Tue Apr 18 18:58:09 IST 2017 4月18日星期二18:58:09 IST 2017
我在这里尝试了另一个选项我看到它甚至在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;
}
OUT PUT: 转换日期:星期二4月18日06:28:09 IST 2017
有人可以帮忙解决这个问题:我找到了许多将IST日期时间转换为PST字符串而非IST / EST日期转换为PST日期的解决方案。 正如我上面提到的,我们可以格式化为String,但我正在寻找转换回Date
的示例答案 0 :(得分:3)
您应该查看Java 8的直接处理时区的新Date 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
答案 1 :(得分:2)
由于这里的一些读者将使用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为18:58:09 IDT(UTC + 3)因为它知道以色列是在4月18日的DST;我返回到下面的SimpleDateFormat
更加字面上IST
,并将18:58:09 IST解释为18:58:09 +0200,这是1小时后的UTC。
如果需要,可以将java.time
类与Java 1.7一起使用。您可以在the 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
对象。