2013-03-14 45 views
0

我在IST中有一個日期時間。如果考慮夏令時,我想根據輸入將其轉換爲美國時區,如果在java中給定日期時間存在夏令時,則爲 。 這就是我想考慮到java中的夏令時,將IST轉換爲美國時區

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)); 

}

+0

你試過的代碼在哪裏? – Apurv 2013-03-14 11:56:01

+0

那麼你想將它轉換爲CDT? – 2013-03-14 12:00:58

回答

1

要將給定的日期轉換爲不同的時區,您需要使用適當的時區創建日期格式化程序。日期實例相對於時代來說只是一個很長的值;它沒有時區信息。所以我們不會將它轉換到不同的時區,我們只是在不同的時區代表它。這就是爲什麼我們需要創建日期實例的字符串表示時需要時區信息的原因。

下面是一些代碼來說明上述情況。我剛剛將時區添加到日期格式字符串中以清楚說明。

/* 
* 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小時」,因爲此時區實例使用夏令時。因此,通過使用適當的時區,您應該也能夠處理夏令時。

+0

public void convert(Date dt){日曆dt} {日曆cal = Calendar.getInstance(); cal.setTime(dt); //在IST中獲取時間 \t \t long millis = cal.getTimeInMillis(); GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone(「America/Chicago」),Locale.US); calendar.setTimeInMillis(millis); \t \t Date date = calendar.getTime(); (新的SimpleDateFormat(「yyyy-MM-dd HH:mm:ss」).format(date));}這是我試過的。但是我得到的輸出與我給出的輸入一樣... !!! – akhilgm 2013-03-14 13:23:17

+0

@ akhilgm89,你得到相同的日期字符串,因爲你正在使用具有默認時區的SimpleDateFormat實例,這將是你係統的時區。 「日期」實例只是一個很長的值,表示自紀元以來的毫秒數;它不包含時區信息。當您創建字符串表示形式時,您需要指定要使用的時區。我編輯了我的帖子,用代碼解釋了這一點。看一看。 – Kshitij 2013-03-15 05:49:41

+0

它工作..... !!!!!! thnx很多.... :) – akhilgm 2013-03-15 06:21:11

0

喬達時間

使用Joda-Time使這要容易得多。或者嘗試Java 8中的新java.time包。

以下是使用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可以表示愛爾蘭標準時間或印度標準時間。使用proper time zone names

相關問題