2017-04-18 147 views
0

我尝试下面的方法和搜索在网络找到这个解决方案,但没有运气:寻找解决方案,用于IST将字符串转换成PST:字符串转换为日期在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 这里是出放:

星期二4月18日18时58分09秒IST 2017年 星期二4月18日18时58分09秒IST 2017年

我在这里尝试了另一个选项我看到它甚至是showi纳克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日6时28分09秒IST 2017年

是否有人可以在此帮助:我发现很多解决方案将IST日期时间转换为PST字符串,但没有将IST/EST日期转换为PST日期。 正如我上面提到,我们可以格式化为一个字符串,但我期待的转换回日期的例子

+4

您正在打印Date.toString()的结果。不要这样做。 “Date”对象不具有*时区 - 它只是一个实例。 'convertFromOneTimeZoneToOhter'方法在其整体目的上存在根本性缺陷。使用'SimpleDateFormat'指定格式化所需的时区。 –

+3

你有没有考虑过使用更好的日期/时间API? (因为'java.util.Date'对于你所需要的很糟糕 - 实际上它很糟糕)。对于Java <= 1.7,请使用[Joda-Time](http://www.joda.org/joda-time/)或[ThreeTen backport](http://www.threeten.org/threetenbp/),以及java> = 1.8,使用'java.time'类。花一些时间来学习这些,这是完全值得的。 – 2017-04-18 13:47:19

+0

@JonSkeet,我使用SimpleDateFormat,但我可以将其转换为只字符串。我的要求是将日期IST转换为日期PST。 – user7076183

回答

3

你应该看看的Java 8新的日期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 
+0

感谢您的建议,但我们正在使用Java 1.7 :( – user7076183

+0

如果你愿意,你可以使用Java 1.7的'java.time'类,你可以在[ThreeTen Backport](http:// www.threeten.org/threetenbp/) –

+0

您可能特别喜欢['ZonedDateTime.withZoneSameInstant()'](https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html #withZoneSameInstant-java.time.ZoneId-),@ user7076183。 –

1

由于这里的一些读者将使用Java 8或更高版本以及一些Java 7或更早的版本,我将同时使用这两种版本。

我建议如果可以的话,你可以在Java 8中引入的java.time类:

此打印:

Tue Apr 18 08:58:09 -0700 2017 

你说你想要一个PST日期,而这也正是ZonedDateTime为您提供:带时区信息的日期和时间。

在这个例子中,我给出了字符串中的区域偏移量+0300(对应于以色列夏令时)。我了解,这对您而言并不重要。我想避免三个和四个字母的时区缩写,如ISTIST不仅意味着爱尔兰标准时间,以色列标准时间或印度标准时间。我还注意到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 1.7的java.time类。你可以在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对象。 A Date对象不能保存任何时区信息,所以如果你需要这个,你将不得不把targetTz对象与d一起。这是一个常见的误解,应该是Date对象中的一个时区,这可能是由于其toString()打印了一个时区的事实。这总是JVM的默认时区,但不是来自Date对象。