2017-04-18 144 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對象。