2015-01-07 29 views
0

我試圖顯示基於時區的日期。Java日期顯示前一天,下個月和完全不同的年份

如果我將系統時區更改爲美國太平洋時區,則今天的日期顯示正確。如果我想顯示2000-01-01輸出顯示爲12/31/1969。

如果我必須在系統設置或Java設置中進行任何更改,您可以讓我知道嗎? 下面是示例代碼:

package timezoneexample; 
import java.text.DateFormat; 
import java.util.Date; 
import java.util.TimeZone; 


public class TimezoneExample { 

public static void main(String args[]) { 
    DateFormat dateFormat = null; 

    String datePattern = null; 
    char dateSeperator = '/'; 
    try { 
     datePattern = "MM/dd/yyyy"; 
     if (datePattern.length() <= 0) 
      throw new java.util.MissingResourceException(
        "Didn't find date format", "", ""); 
     boolean hasSeperatorAlready = false; 
     for (int i = 0; i < datePattern.length(); i++) 
      if (!Character.isLetter(datePattern.charAt(i))) 
       if (hasSeperatorAlready) 
        throw new java.util.MissingResourceException(
          "Unvalid date format", "", ""); 
       else 
        dateSeperator = datePattern.charAt(i); 
    } catch (java.util.MissingResourceException mre) { 
     System.out.println(mre); 
    } 

    dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM); 
    if (datePattern.length() > 0 
      && dateFormat instanceof java.text.SimpleDateFormat) { 
     java.text.SimpleDateFormat sdf = (java.text.SimpleDateFormat) dateFormat; 
     sdf.applyPattern(datePattern); 
    } 

    dateFormat.setTimeZone(java.util.TimeZone.getDefault()); 

    // enter DOB 
    Date dob = new Date(2000 - 01 - 01); 
    Date today = new Date(); 
    String timeZone = System.getProperties().getProperty("user.timezone"); 

    TimeZone tZone = TimeZone.getTimeZone(timeZone); 

    System.out.println("Timezone : " + tZone); 

    dateFormat.setTimeZone(tZone); 

    System.out.println("Date Of Birth : " + dateFormat.format(dob)); 
    System.out.println("Date in Displayed as per Timezone : " 
      + dateFormat.format(today)); 

} 

} 

輸出:

Timezone : sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]] 

出生日期:1969年12月31日

在日期顯示爲每時區:2015年1月7日

+0

聽起來很像Unix時間戳'-1' –

+3

我會更密切地關注這裏:'日期DOB =新的日期(2000 - 01 - 01); ' –

回答

0

new Date(...)需要一個long值,表示自1970年1月1日以來的毫秒數。您正在指定2000 - 1 - 1。這不是「2000年,1月和1日」,它是一個等於1998毫秒的數字表達式。

要創建基於年/月/日的日期,使用Calendar

Calendar c = Calendar.getInstance(); 
c.set(y, m-1 /* 0-based */, d); // e.g. c.set(2000, 0, 1); 
return c.getTime(); 
1

你的錯誤是在這裏:

Date dob = new Date(2000 - 01 - 01); 

這將被解釋爲:

Date dob = new Date(1998); 

這將調用Date(long date)構造函數,導致1970/01/01附近的日期。

你最想的是:

Date dob = new Date(2000, 1, 1); 
+0

注意:新的Date(int,int,int)已被棄用,最好使用Calendar。 – geert3

相關問題