Java日期:Date、Calendar及DateFormat格式化

QuibblerQuibbler 2020-03-26 约 15 分钟 2044 次阅读

Java日期:Date、Calendar及DateFormat格式化

显示、记录日期在开发中非常常见,Java提供了基础的日期类Date。

1、Date

1.1、Date构造函数

        ①默认构造函数:默认当前时间作为参数,调用第②个构造函数。

public Date() {
        this(System.currentTimeMillis());
    }

        ②以计算机“时间远点”的起始毫秒数作为参数。

/**
     *分配一个Date对象,并将其初始化为表示自标准基准时间(即“纪元”)(即GMT 1970年1月1日)以来指定的毫秒数。
     */
    public Date(long date) {
        fastTime = date;
    }

        ③年/月/日   已废弃

/**
     * @param   year    减去1900年。
     * @param   month   0-11之间的月份。
     * @param   date    一个月中的天数,在1-31之间.
     * @deprecated As of JDK version 1.1,
     */
    @Deprecated
    public Date(int year, int month, int date) {
        this(year, month, date, 0, 0, 0);
    }

        ④年/月/日/时/分   已废弃

/**
     * @param   year    the year minus 1900.
     * @param   month   the month between 0-11.
     * @param   date    the day of the month between 1-31.
     * @param   hrs     the hours between 0-23.
     * @param   min     the minutes between 0-59.
     * @deprecated As of JDK version 1.1,
     */
    @Deprecated
    public Date(int year, int month, int date, int hrs, int min) {
        this(year, month, date, hrs, min, 0);
    }

        ⑤年/月/日/时/分/秒   已废弃

public Date(int year, int month, int date, int hrs, int min, int sec);

        ⑥字符串形式表示日期   已废弃

@Deprecated
    public Date(String s) {
        this(parse(s));
    }

1.2、Date常用方法

Date日期类提供了丰富的方法获取年、月、日、时、分等日期。

①long getTime():返回自格林尼治标准时间1970年1月1日00:00:00以来的毫秒数

public long getTime() {
        return getTimeImpl();
    }

        ②getYear():获取年份 -1900

        ③getMonth():获取月份 0~11

        ④getDate():获取一个月中的第几天 1~31

        ⑤getDay():获取一周中的第几天 0~6

        ⑥getHours():获取小时 0~23

        ⑦getMinutes():获取分钟 0~59

        ⑧getSeconds():获取秒数 0~59

2、Calendar

Calendar类的实现比Date类要复杂,功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息时考虑了时区等问题。

2.1、获取Calendar对象

Calendar类是抽象类(它的实现类是GregorianCalendar),且Calendar类的构造方法是protected,无法使用Calendar类的构造方法来创建对象,好在Java提供了几种getInstance方法用来创建对象。默认返回的Calender都是当前日期。

①getInstance()

public static Calendar getInstance()
    {
        return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
    }

②getInstance(TimeZone zone)

public static Calendar getInstance(TimeZone zone)
    {
        return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
    }

③getInstance(Locale aLocale)

public static Calendar getInstance(Locale aLocale)
    {
        return createCalendar(TimeZone.getDefault(), aLocale);
    }

④getInstance(TimeZone zone,Locale aLocale)

public static Calendar getInstance(TimeZone zone,Locale aLocale)
    {
        return createCalendar(zone, aLocale);
    }

这几个方法都是调用内部的私有静态方法createCalendar(TimeZone zone,Locale aLocale)返回GregorianCalendar对象。

private static Calendar createCalendar(TimeZone zone,Locale aLocale){
        // BEGIN Android-changed: only support GregorianCalendar here
        return new GregorianCalendar(zone, aLocale);
        // END Android-changed: only support GregorianCalendar here
    }

2.2、Calendar中的字段

Calendar类中用一下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想。

//年份
    Calendar.YEAR
    
    //月份
    Calendar.MONTH
    
    //日期
    Calendar.DATE
    
    //日期,和上面的字段意义相同
    Calendar.DAY_OF_MONTH
    
    //12小时制的小时
    Calendar.HOUR
    
    //24小时制的小时
    Calendar.HOUR_OF_DAY
    
    //分钟
    Calendar.MINUTE
    
    //秒
    Calendar.SECOND
    
    //星期几
    Calendar.DAY_OF_WEEK

2.3、Calendar中的方法

设置set、获取get等方法操作、获取Calendar日期信息。

2.3.1、set方法

①set(int field, int value) 设置指定字段对应的值

public void set(int field, int value)
    {
        // If the fields are partially normalized, calculate all the
        // fields before changing any fields.
        if (areFieldsSet && !areAllFieldsSet) {
            computeFields();
        }
        internalSet(field, value);
        isTimeSet = false;
        areFieldsSet = false;
        isSet[field] = true;
        stamp[field] = nextStamp++;
        if (nextStamp == Integer.MAX_VALUE) {
            adjustStamp();
        }
    }

②set(int year, int month, int date):设置Calendar的年月日,内部也是分别调用上面的方法实现的。

public final void set(int year, int month, int date)
    {
        set(YEAR, year);
        set(MONTH, month);
        set(DATE, date);
    }

③set(int year, int month, int date, int hourOfDay, int minute):同上

④set(int year, int month, int date, int hourOfDay, int minute,int second):同上

2.3.2、get方法

返回给定日历字段的值。 在宽大模式下,所有日历字段均已标准化。 在非宽容模式下,将验证所有日历字段,并且如果任何日历字段的值超出范围,则此方法将引发异常。 归一化和验证由{@link #complete()}方法处理,该过程为日历。

①getTime():返回当前时间的Date对象

public final Date getTime() {
        return new Date(getTimeInMillis());
    }

②get(int field):获取指定时间域的值

public int get(int field)
    {
        complete();
        return internalGet(field);
    }

例:

// 获得年份
    int year = calendar.get(Calendar.YEAR);

2.3.3、add方法

对Calendar中指定的时间域进行计算。

abstract public void add(int field, int amount);

在Calendar中是抽象方法,在它的实现类GregorianCalendar中实现该方法(实现有点复杂,就不贴代码了)。

例:

//把calendar对象的日期加上8,也就是calendar所表的日期的8天后的日期,其它所有的数值会被重新计算
    calendar.add(Calendar.DATE, 8);

3、DateFormat

DateFormat是日期/时间格式化子类的抽象类,该子类以与语言无关的方式格式化和解析日期或时间。它的实现类是SimpleDateFormat。通常用来完成时间的指定格式化转换。

3.1、Date->String

将Date格式化成指定样式的String

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
    String dateStr=sdf.format(new Date());
    //输出2020-05-12

3.1、String->Date

将String解析成指定日期格式

String str="2020-5-12";
    SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
    Date birthday = sdf.parse(str);

参考资料:

        JAVA中Date类的使用

        java之Date(日期)、Date格式化、Calendar(日历)

        Java时间日期格式转换

        本地化Locale与DateFormat日期时间格式化

        Java中的本地化日期格式(Localized date format in Java)

相关推荐

精选
获取系统SDK版本、判断手机ROM
Code

获取系统SDK版本、判断手机ROM

Build获取系统SDK版本Android中部分API的使用,需要在特定的SDK版本之后才能使用,因此在兼容老版本SDK的时候,经常需要判断API的版本。各种Android版本的对应关系参考《Android各版本对应的SDK版本》判断手机ROM有时候需要判断手机系统的ROM,检测ROM是MIUI、EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件(关于build.p

3.7k
精选
AndroidStudio中各种中文乱码问题
Code

AndroidStudio中各种中文乱码问题

AndroidStudio中各种中文乱码问题1、编译Java错误信息乱码在出现这个Annotation processors must be explicitly declared now...问题的时候,正好也发现AndroidStudio Build Output错误信息都乱码。经常遇到各种问题,习惯了,现在遇到的问题,都是以后的答案。 1.1、修改项目build.gradle(无效)在整个p

2.4k
AndroidStudio 报错:has no declaration in the base values folder
Code

AndroidStudio 报错:has no declaration in the base values folder

在资源文件中正常定义的值,也能编译运行。昨天还正常,今天一打开就报错。应该又是AndroidStudio自身的Bug了。原因众说纷纭,参考Stack Overflow 一篇类似的讨论。解决:File => Invalidate Caches / Restart => Invalidate and Restart.

4.4k