Java日期显示前一天,一个月和完全不同的一年

时间:2015-01-07 10:46:33

标签: java java-7

我正在尝试根据时区显示日期。

如果我将系统时区更改为美国太平洋时区,则会正确显示今天的日期。如果我想将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年7月1日

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

new Date(...)需要long值,表示自1970年1月1日以来的毫秒数。您正在指定2000 - 1 - 1。这不是&#34; 2000年,第1个月和第1天&#34;,它是一个等于1998毫秒的数字表达式。

要根据年/月/日创建日期,请使用Calendar

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