Java日期时间

Data类

Java.util包提供了Data类来封装当前的日期和时间。
它有2个构造函数:

  • public Date();
  • public Date(long millisec);//该参数是从1970年1月1日起的毫秒数。

Date类中常用的方法有:

  • boolean after(Date date)
    若当调用此方法的Date对象在指定日期之后返回true,否则返回false。
  • boolean before(Date date)
    若当调用此方法的Date对象在指定日期之前返回true,否则返回false。
  • int compareTo(Date date)
    比较当调用此方法的Date对象和指定日期,两者相等返回0。调用对象在指定日期之前则返回-1,调用对象在指定日期之后则返回1。
  • long getTime()
    返回自1970年1月1日00:00:00 GMT以来此Date对象表示的毫秒数。
  • void setTime(long time)
    用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
  • String toString( )
    把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
    下面是代码演示:
public class DateTest {
    public static void main(String[] args) {
        Date date01 = new Date();
        Date date02 = new Date(1000000);
        System.out.println(date01.toString());
        System.out.println(date02.toString());

        System.out.println(date01.after(date02));
        System.out.println(date01.before(date02));
        System.out.println(date01.compareTo(date02));

        System.out.println(date01.getTime());
    }
}

输出为:

Thu Apr 12 15:11:55 CST 2018
Thu Jan 01 08:16:40 CST 1970
true
false
1
1523517115400

Calendar类(日历类)

Calendar是一个抽象类,GregorianCalendar是它的一个具体实现类

  1. 获取一个Calendar实例方法:Calendar.getInstance(),用这个j静态方法获取的实例就是:GregorianCalendar对象(与new GregorianCalendar获取的结果一致)。
  2. set()方法:使用下面三个方法把日历定到任何一个时间:
  • void set(int year, int month, int date)
  • void set(int year, int month, int date, int hour, int minute)
  • void set(int year, int month, int date, int hour, int minute, int second)
  • void set(int field, int value) //这个方法是修改某一个值
    代码演示如下:
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar instanceof GregorianCalendar);
        System.out.println(calendar.getTime());
        
        calendar.set(2020, 5, 1);
        System.out.println(calendar.getTime());
        
        calendar.set(1999, 10, 1, 13, 53);
        System.out.println(calendar.getTime());
        
        calendar.set(2002, 12, 11, 15, 34, 30);
        System.out.println(calendar.getTime());
        
        calendar.set(Calendar.YEAR, 2017);
        System.out.println(calendar.getTime());

输出为:

true
Fri Apr 13 11:38:47 CST 2018
Mon Jun 01 11:38:47 CST 2020
Mon Nov 01 13:53:47 CST 1999
Sat Jan 11 15:34:30 CST 2003
Wed Jan 11 15:34:30 CST 2017
  1. get()方法:获取年份,月份,小时等信息使用的方法
  • int get(Calendar.Month);0表示1月,1表示2月,.....,11表示12月
  • int get(Calendar.DAY_OF_MONTH)获得这个月的第几天
  • int get(Calendar.DAY_OF_WEEK)获得这个星期的第几天
  • int get(Calendar.DAY_OF_YEAR)获得这个年的第几天
  • long getTimeMillis()获得当前时间的毫秒表示
    代码演示:
        Date date = new Date();
        calendar.setTime(date);
        System.out.println(calendar.getTime());
        System.out.println("月份是:" + (calendar.get(Calendar.MONTH) + 1));
        System.out.println("获得这个月的第几天:" + calendar.get(Calendar.DAY_OF_MONTH));
        System.out.println("获得这个星期的第几天:" + calendar.get(Calendar.DAY_OF_WEEK));
        System.out.println("获得这个年的第几天:" + calendar.get(Calendar.DAY_OF_YEAR));
        System.out.println(calendar.getTimeInMillis());

输出为:

Fri Apr 13 14:27:00 CST 2018  //这一天是周五
月份是:4
获得这个月的第几天:13
获得这个星期的第几天:6
获得这个年的第几天:103
1494488070158
  1. 日期计算相应方法:add()、after()和before()
  • abstract void add(int field, int amount)
    根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  • boolean after(Object when)
    判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。
  • boolean before(Object when)
    判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。
    代码演示:
        Calendar calendar01 = Calendar.getInstance();
        System.out.println(calendar01.getTime());
        calendar01.add(Calendar.MONTH, 1);//在当前的月份上加1
        System.out.println(calendar01.getTime());

        Calendar calendar02 = Calendar.getInstance();
        System.out.println(calendar01.after(calendar02));//判读calendar01是否在calendar02之后
        System.out.println(calendar01.before(calendar02));//判断calendar01是否在 calendar02之前

输出为:

Fri Apr 13 14:16:29 CST 2018
Sun May 13 14:16:29 CST 2018
true
false
下面来看看Calendar和Date的转换:

Calendar calendar = Calendar.getInstance();
//从一个Calendar对象中获取Date对象
Date date = calendar.getTime();
//将Date对象反应到一个Calendar对象中,
//Calendar/GregorianCalendar没有构造函数可以接受Date对象
//所以我们必须先获得一个实例,然后设置Date对象
calendar.setTime(date);


GregorianCalendar类(标准日历)

GregorianCalendar是Calendar的一个具体子类。提供了世界上大多数国家使用的标准日历系统。GregorianCalendar是在java.util包里。
它的主要方法有:

  • int GregorianCalendar.get(GregorianCalendar.YEAR); //得到年
  • int GregorianCalendar.get(GregorianCalendar.MONTH); //得到月
  • int GregorianCalendar.get(GregorianCalendar.DATE); //得到天
  • int GregorianCalendar.get(GregorianCalendar.Day_OF_WEEK); //一星期的第几天
  • int GregorianCalendar.get(GregorianCalendar.Day_OF_MONTH); //一月的第几天
  • int isLeapYear(int year);//判断某年是否是闰年
GregorianCalendar gc = new GregorianCalendar();
gc.isLeapYear(1993);//false

注意:在GregorianCalendar和Calendar里面,星期天是一周开始的第一天,而0代表现实生活中的一月,11代表十二月。

使用set的时候需要注意的问题:

        GregorianCalendar gc = new GregorianCalendar();
        gc.isLeapYear(1993);// false
        gc.set(2018, 1, 19);
        System.out.println(gc.get(Calendar.YEAR) + "-" + (gc.get(Calendar.MONTH)+1)
                + "-" + gc.get(Calendar.DATE));//2018-2-19
        gc.set(2018, 4, -2);//用4月的最后一天减去设置的日期,这里就是4月30号减2
        System.out.println(gc.get(Calendar.YEAR) + "-" + (gc.get(Calendar.MONTH)+1)
                + "-" + gc.get(Calendar.DATE));//2018-4-28
        gc.set(2018, 2, 0);
        System.out.println(gc.get(Calendar.YEAR) + "-"   + (gc.get(Calendar.MONTH) + 1) + 
          "-" + gc.get(Calendar.DATE));//2018-2-28

由上可得:

  • 日期可以自由加减。如果设为0表示上月的最后一天。
  • 月份也可以是负数,规则与日期一样,就不上代码了。(月份就是12月-你设置的那月)
  • 实测将年份设为非正数时,会自动变为绝对值+1,不知其意义。

测试题

下面来看看这个例子。
例1:

        Date date01 = new Date(1391174450000L); // 2014-1-31 21:20:50
        String dateStr = "2014-1-31 21:20:50 ";
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        try {
            Date dateTmp = dateFormat.parse(dateStr);
            System.out.println(dateTmp);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        String dateStrTmp = dateFormat.format(date01);
        System.out.println(dateStrTmp);

        // 我当前系统的时间
        Date date02 = new Date();
        System.out.println(date02);
        System.out.println(dateFormat.format(date02));

输出为:

Sat Feb 01 05:20:50 CST 2014
2014-01-31 13:20:50
Fri Apr 13 15:34:50 CST 2018
2018-04-13 07:34:50

我的操作系统时区 是"Asia/Shanghai",即GMT+8的北京时间,那么执行日期转字符串的format方法时,由于日期生成时默认是操作系统时区,因此 2014-1-31 21:20:50是北京时间,那么推算到GMT时区,自然是要减8个小时的,即结果(2014-01-31 13:20:50);而执行字符串转日期的parse方法时,由于字符串本身没有时区的概念,因此 2013-1-31 22:17:14就是指GMT(UTC)时间【ps:所有字符串都看做是GMT时间】,那么当转化为日期时要加上默认时区, 即"Asia/Shanghai",因此要加上8个小时。

例2:

        Date date03 = new Date(1391174450000L); // 2014-1-31 21:20:50
        System.out.println(date03);
        Calendar calendar03 = Calendar.getInstance();
        calendar03.setTimeZone(TimeZone.getTimeZone("GMT"));
        // 或者可以 Calendar calendar =
        // Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        calendar03.setTime(date03);
        System.out.println(calendar03.get(Calendar.HOUR_OF_DAY) + ":"
                + calendar03.get(Calendar.MINUTE));

输出为:

Fri Jan 31 21:20:50 CST 2014
13:20

Calendar不涉及到日期与字符串的转化,因此不像SimpleDateFormat那么复杂,与日期转字符串的思路类似。但是需要注意的是,设置完时区后,我们不能用calendar.getTime()来直接获取Date日期,因为此时的日期与一开始setTime时是相同值,要想获取某时区的时间,正确的做法是用calendar.get()方法,那么我们怎么获得Date类型的日期呢?看例3

例3:

        Date date03 = new Date(1391174450000L); // 2014-1-31 21:20:50
        System.out.println(date03);
        Calendar calendar03 = Calendar.getInstance();
        calendar03.setTimeZone(TimeZone.getTimeZone("GMT"));//把时区设置到零时区
        // 或者可以 Calendar calendar =
        // Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        calendar03.setTime(date03);
        System.out.println(calendar03.get(Calendar.HOUR_OF_DAY) + ":"
                + calendar03.get(Calendar.MINUTE));
        System.out.println(calendar03.getTime());//自己打印的话就是开始设置时候的值
        Calendar calendar04 = Calendar.getInstance();
        calendar04.set(calendar03.get(Calendar.YEAR),//只有一个一个的获取出来设置到另
                                    //一个Calendar类里面
                calendar03.get(Calendar.MONTH),
                calendar03.get(Calendar.DAY_OF_MONTH),
                calendar03.get(Calendar.HOUR_OF_DAY),
                calendar03.get(Calendar.MINUTE),
                calendar03.get(Calendar.SECOND));
        System.out.println(calendar04.getTime());

输出为:

Fri Jan 31 21:20:50 CST 2014
13:20
Fri Jan 31 21:20:50 CST 2014
Fri Jan 31 13:20:50 CST 2014

请尊重作者劳动成果,转载请标明原文链接:https://www.jianshu.com/p/14172c2c0846

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