android – SimpleDateFormat子类在这一年增加了1900

我已经创建了几个SimpleDateFormat的子类来简化处理我在 Android上谈论的Azure提要.其中一个如下:

public class ISO8601TLDateFormat extends SimpleDateFormat {

    private static String mISO8601T = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";

    public ISO8601TLDateFormat() {
        super(mISO8601T);
    }

    public ISO8601TLDateFormat(Locale inLocale) {
        super(mISO8601T,inLocale);
    }
}

正如您所看到的,目的是生成或解释日期

2012-03-17T00:00:00.000 0100

这是Azure服务所期望的.但是,当我输入从DatePicker构造的Date对象时:

mDate = new Date(mDatePicker.getYear(),mDatePicker.getMonth(),mDatePicker.getDayOfMonth());

ISO8601TLDateFormat的输出

3912-03-17T00:00:00.000 0100

正如你所看到的,这一年比我更多,或者不是未来的任何人都需要.我已经仔细检查了Date对象到Azure Feed系统的整个过程,它报告的日期是2012年,这是我所期望的.为什么SimpleDateFormat会破坏?

解决方法

问题是Date的构造函数没有得到你期望的结果.取自java documentation

public Date(int year,int month,int date)
Deprecated. As of JDK version 1.1,replaced by Calendar.set(year + 1900,month,date) or GregorianCalendar(year + 1900,date).
Allocates a Date object and initializes it so that it represents midnight,local time,at the beginning of the day specified by the year,and date arguments.
Parameters:
year - the year minus 1900.
month - the month between 0-11.
date - the day of the month between 1-31.

你需要记住,你构造的日期是0,1,是1900年1月1日.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...