日期时间

在整个Java程序设计的过程之中,日期时间是一个非常重要的话题,同时几乎所有的项目开发都不可能离开日期时间的处理操作,而整个的Java里面针对日期时间也提供有一系列的工具类供开发者使用。

Date类

java.util.Date类是在Java之中获得日期时间操作的最简单的一个程序类,这个类可以直接通过对象实例化Date类对象的形式获取当前的日期时间。

范例:

import java.util.Date;

public class Test {

    public static void main(String[] args) {
        System.out.println(new Date());
    }

}

执行结果:

Wed May 27 13:52:39 CST 2020

Date里面所给出的日期时间默认格式采用的是国外人的习惯,所有中国人民肯定不习惯,但是它已经可以包含正确的信息,如果要想进行更加详细的处理,后面会有专门的类。

在整个Date类里面也提供有如下的一下操作方法。


Date类构造方法

在之前讲解数据类型划分的时候就重点强调了:在Java程序里面,日期时间,内存大小或者文件大小都是用long数据类型来进行描述。

在Date类里面通过构造方法可以结构一个long日期时间的数字,也可以通过Date返回一个long类型的数据。

Date类其它操作方法

如果要想清楚的理解Date类之中,两个构造彼此之间的关系,最佳的做法还是需要浏览一下Date类的构造方法的源代码。

Date类构造方法比较

所谓的无参构造方法实际上会自动进行单参构造的调用,并且传递的参数也是System类之中所获得的时间日期数值。

范例:long与Date类之间的转换操作

import java.util.Date;

public class Test {

    public static void main(String[] args) {

        long dateTime = System.currentTimeMillis() - 10000;     //得到了long的数据类型

        Date dateA = new Date(dateTime);
        Date dateB = new Date();

        System.out.println(dateA);
        System.out.println(dateB);

        System.out.println("两个日期之间所差的毫秒数:" + (dateB.getTime() - dateA.getTime()));
    }

}

输出:

Wed May 27 14:05:19 CST 2020
Wed May 27 14:05:29 CST 2020
两个日期之间所差的毫秒数:10001

Calendar类

在整个Java里面,虽然Date可以描述时间,但是除了日期时间之外还有许多与日历有关的操作,例如:假设需要知道某一个日期所在月的某一天,或者说判断某一个日期是否处于闰年,对于这些繁琐的日期处理操作,在Java里面就可以采用java.util.Calendar程序类完成相应的处理操作。

首先观察一下Calendar类的基本定义:

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>

发现Calender类属于一个抽象类,那么按照原始的概念来理解的话,这个时候应该通过子类进行对象的实例化。
而通过JavaDoc的文档发现有一个RegorianCalendar子类。但是这个时候继续观察一下Calendar提供的方法,会发现提供了一个获取Calendar对象实例的静态方法。

public static Calendar getInstance()

Calendar的getInstance
Calendar常用方法

范例:得到当前的日期时间

import java.util.Calendar;

public class Test {

    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();     //获取对象实例
        System.out.println(String.format("当前的日期时间格式: %s-%s-%s %s:%s:%s",
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH) + 1,
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                calendar.get(Calendar.SECOND)
        ));


    }

}

输出:

当前的日期时间格式: 2020-5-27 14:22:53

非常抱歉的是在使用Calendar类获取日期时间数值的时候一般都需要进行一些补0的处理,但是获得当前的日期时间并不是Calendar的主要作用,这个类主要使用的是日历的计算。

范例:实现日期的准确计算

import java.util.Calendar;

public class Test {

    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();     //获取对象实例

        calendar.add(Calendar.MONTH,6); //计算半年之后的日期
        calendar.add(Calendar.YEAR,30); //30年之后

        System.out.println(String.format("当前的日期时间格式: %s-%s-%s %s:%s:%s",
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH) + 1,
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                calendar.get(Calendar.SECOND)
        ));

    }

}

输出:

当前的日期时间格式: 2050-11-27 14:26:17

如果此时没有采用这样的操作类进行日期的处理,而是使用long进行计算,那么得到的日期时间一定是不准确的。既然Calender描述的是一个日期结构,就可以考虑进行日期上的调用。

范例:找到8月的最后一天

import java.util.Calendar;

public class Test {

    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();     //获取对象实例

        calendar.set(calendar.get(Calendar.YEAR) , 8,1);       //通过9月计算8月最后一天
        calendar.add(Calendar.DATE , -1);       //9月的最后一天减 1

        System.out.println(String.format("当前的日期时间格式: %s-%s-%s %s:%s:%s",
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH) + 1,
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                calendar.get(Calendar.SECOND)
        ));

    }

}

输出:

当前的日期时间格式: 2020-8-31 14:31:1

如果要想进行指定日期的最后一天的操作,则就应该定位到指定的日期上,随后再利用一些加减的操作获取日期数据,由于本程序需要获取到8月的最后一天,那么就将日期设置为9月的第一天,然后利用add()方法在天数上做一个-1的操作,就变为了8月的最后一天。

SimpleDateFormat

通过之前的对比可以发现使用Date类获取日期时间要比Calendar类获取的日期时间更加的简单(Calendar类功能不在于数据的获取,而在于日期的计算上),可是通过Date类获取的时间(Wed May 27 14:37:14 CST 2020)实在是不方便阅读。

所以在实际的开发之中就会存在一种格式化日期的操作,而这种处理操作主要依靠java.text.SimpleDateFormat类完成。

这个类有如下的几个操作方法:


SimpleDateFormat

如果要想成功的对日期进行格式化或者将字符串转为日期,那么就必须要存在有一个日期时间的匹配表达式,而这组表达式里面最重要的几个日期时间单位:年(yyyy)、月(MM)、日(dd)、时(HH)、分(mm)、秒(ss)、毫秒(SS)。
范例:

import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {

  public static void main(String[] args) {

      Date date = new Date();

      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      
      System.out.println(simpleDateFormat.format(date));

  }

}

输出:

2020-05-27 14:46:28

这个时候所获得的日期时间的字符串的信息就非常符合国人的使用习惯了,采用类似的匹配表达式,也可以实现字符串转为日期时间的处理。

范例:字符串转日期

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Test {

    public static void main(String[] args) throws ParseException {

        String str = "2020-05-27 14:46:28";

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        System.out.println(simpleDateFormat.parse(str));

    }

}

输出:

Wed May 27 14:46:28 CST 2020
数据类型转换表
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容