zoukankan      html  css  js  c++  java
  • Java_日期时间相关类


    在java中获取日期时间相关的Date类和抽象类Calendar 以及格式化时间的类SimpDateFormat。Date类中的大部分方法都已经过时了。在java1.8后又新增了处理时间相关的类(java.time包)且该包下所有的类都是不可变类型且线程安全。

    • Instant 瞬时实例
    • LocalDate 本地日期,不包含具体时间
    • LocalTime 本地时间,不包含日期
    • LocalDateTime 日期和时间,不包含时差和时区信息
    • ZonedDateTime 完整的日期和时间,包含时区和时差信息

    一、Date类(java.util.date)

    使用date类获取时可以使用toString()方法,将 Date 对象转换为 String: dow mon dd hh:mm:ss zzz yyyy形式 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

     // 时间以1970 年 1 月 1 日 00:00:00 GMT 为基准来计算
     Date date = new Date(); //内部调用的是System的currentTimeMillis()方法
     Date d = new Date(1432356666666L); //某一时间的毫秒数
    
     System.out.println(date.toString()); // Mon Jul 23 21:56:29 CST 2018
     System.out.println(d.toString());   // Sat May 23 12:51:06 CST 2015
     System.out.println(System.currentTimeMillis()); // 当前系统时间的毫秒数
     System.out.println(date.getTime()); // 当前系统时间的毫秒数
     // 日期时间的比较
     System.out.println(date.after(d)); //true  date在指定时间之后则返回 true
     System.out.println(date.before(d));//false date在指定时间之前则返回 true
     System.out.println(date.equals(d));//false 比较两个日期的相等性
    
     System.out.println(date.compareTo(d)); // 1
     // 比较当调用此方法的Date对象和指定日期。
     // 两者相等时候返回0。
     // 调用对象在指定日期之前则返回负数。
     // 调用对象在指定日期之后则返回正数。
    
     System.out.println(date.toInstant()); // 2018-07-23T14:28:17.211Z
    

    二、Calendar类(java.util.Calendar)

    Calendar类是一个抽象类,可以方便的设置和获取日期数据的特定部分。它还有个已知的子类GregorianCalendar。
    Calendar中的静态常量(常用的):

    常量 描述
    Calendar.AM 从午夜到中午之前这段时间的 AM_PM 字段值
    Calendar.PM 从中午到午夜之前这段时间的 AM_PM 字段值
    Calendar.YEAR 年份
    Calendar.MONTH 月份
    Calendar.DATE 日期
    Calendar.HOUR 小时(12小时制)
    Calendar.MINUTE 分钟
    Calendar.SECOND
    Calendar.WEEK_OF_YEAR 年内的某星期
    Calendar.WEEK_OF_MONTH 月内的某星期
    Calendar.DAY_OF_YEAR 年内的某天
    Calendar.DAY_OF_MONTH 月内的某天
    Calendar.DAY_OF_WEEK 星期内的某天(从周日开始计算)
    Calendar.HOUR_OF_DAY 小时(24小时制)

    获取当前相关日期时间相关的例子:

     Calendar c = Calendar.getInstance(); // 获取当前时间的日历对象
     Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); //获取东八区的日历实例对象
    
     System.out.println(c.get(Calendar.YEAR));   // 2018 年份
     System.out.println(c.get(Calendar.MONTH)+1);// 7  月份,需要+1
     System.out.println(c.get(Calendar.DATE));   // 23 日期
     System.out.println(c.get(Calendar.AM_PM));  // 1  AM=0, PM=1
     System.out.println(c.get(Calendar.HOUR));   // 10 小时
     System.out.println(c.get(Calendar.MINUTE)); // 32 分钟
     System.out.println(c.get(Calendar.SECOND)); // 50 秒
     System.out.println(c.get(Calendar.MILLISECOND)); // 570  毫秒
    
    //--------------------------------------------------------------------------
    
     System.out.println(c.toString()); // 返回此日历的字符串表示形式
     System.out.println(c.getTime()); // 返回一个Date类型的时间 Tue Jul 24 22:00:44 CST 2018
     System.out.println(c.getTimeInMillis()); // 返回当前时间的毫秒数
     System.out.println(c.getTimeZone().getDisplayName()); // 中国标准时间  默认区域的用户的时区名称
     System.out.println(c.getTimeZone().getID()); // Asia/Shanghai 返回时区ID
     System.out.println(c.getMaximum(Calendar.HOUR)); // 11 返回小时中最大的数
    

    实例:

    判断是否为闰年

    • 方法一
     // 是Calendar具体的子类,提供了一个判断闰年的方法
     GregorianCalendar gc = new GregorianCalendar();
     System.out.println(gc.isLeapYear(2018)? " 是闰年":" 是平年");
    
    • 方法二
     //满足条件之一: 1、能被4整除但不能被100整除2、能被400整 除
     Scaner s =new Scanner(System.in);
     System.out.println("请输入年份:");
     long n = s.nextLong();
     if((n%4 ==0 && n%100 !=0) || n%400 ==0 ){
         System.out.println("是闰年");
     }else {
         System.out.println("是平年");
     }
    

    三、SimpleDateFormat类(java.text.SimpleDateFormat)

    SimpleDateFormat继承抽象类 DateFormat。 是一个以与语言环境有关的方式来格式化和解析日期的具体类,且非线程安全。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。使得可以选择任何用户定义的日期-时间格式的模式。
    日期和时间的格式化编码:

    字母 描述 表示 示例
    y 年份 Year 2018;18
    M 月份 Month July; Jul; 07
    d 月内的日期 Number 10
    h 12小时制(1~12) Number 12
    H 24小时制 (0~23) Number 22
    m 分钟数 Number 30
    s 秒数 Number 55
    S 毫秒数 Number 234
    E 星期几 Text Tuesday
    D 年内的天数 Number 180
    F 月内的星期 Number 2 (second Wed. in July)
    w 年内的周数 Number 40
    W 月内的周数 Number 1
    a AM/PM 标记 Text PM
    k 24小时制(1~24) Number 24
    K 12小时制(0~11) Number 10
    z 时区 General time zone Eastern Standard Time

    上述的模式字母通常是重复的,其数量确定其精确表示:

    • Text:格式化来说,字母数量大于等于4,则使用完全形式;否则,在可用的情况下使用短形式或缩写形式。解析来说,两种形式都是可接受的,与字母的数量无关
    • Number:格式化来说,字母的数量是最小的数位,如果数位不够,则用 0 填充以达到此数量。解析来说,字母的数量被忽略,除非必须分开两个相邻字段。
    • Year:格式器的 Calendar 是格里高利历,则应用以下规则:
        格式化来说,如果字母的数量为 2,则年份截取为 2 位数,否则将年份解释为 number。
        解析来说,如果字母的数量大于 2,则年份照字面意义进行解释,而不管数位是多少.
    • Month: 如果字母的数量为 3 或大于 3,则将月份解释为 text;否则解释为 number。
    • General time zone: 如果时区有名称,则将它们解释为 text。

    实例:

     // 假设不加Locale.ENGLISH,默认则以本系统语言(中文)显示
     Date d = new Date();
     // 年份,月份,日,星期,小时,分钟,秒全显示(数位不够,则用 0 填充)。
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd a EEEE hh:mm:ss.SSS z ",Locale.ENGLISH);
     System.out.println(sdf.format(d)); // 2018/07/08 PM Sunday 01:02:24.562 CST
    
     // 年份只取后两位,月份为Text且简写
     SimpleDateFormat sdf1 = new SimpleDateFormat("yy/M/d a E h:m:s.S z ",Locale.ENGLISH);
      System.out.println(sdf1.format(d)); // 18/7/8 PM Sun 1:2:24.562 CST
    
    //--------------------------------------------------------------
     //使用printf()方法
     System.out.printf("%tc%n",d); // 星期六 七月 08 13:02:24 CST 2018
     System.out.printf("%tF%n",d); // 2018-07-08
     System.out.printf("%tD%n",d); // 07/08/18
     System.out.printf("%tT%n",d); // 13:02:24
     System.out.printf("%tr%n",d); // 01:02:24 下午
     System.out.printf("%tR%n",d); // 13:02
    

    四、java.time包下相关的类

    在最开始也讲了这几个日期时间相关的类的含义,从字面的意思也可以看出这几个类是逐渐的获取更详细的信息。

     System.out.println(Instant.now()); // 从系统时钟获取当前瞬间
     System.out.println(LocalDate.now()); // 从默认时区的系统时钟获取当前日期
     System.out.println(LocalTime.now()); // 从默认时区的系统时钟获取当前时间
     System.out.println(LocalDateTime.now()); // 从默认时区的系统时钟获取当前日期和时间
     System.out.println(ZonedDateTime.now());//从默认时区的系统时钟获取当前的日期时间时差时区
    
     /*结果:
     2018-07-08T08:08:46.701Z
     2018-07-08
     16:08:46.988
     2018-07-08T16:08:46.988
     2018-07-08T16:08:46.989+08:00[Asia/Shanghai]
     */
    
     // 源码是通过((year & 3) == 0) && ((year % 100) != 0 || (year % 400) == 0)来判断
     System.out.println(LocalDate.now().isLeapYear()); // 判断系统的年份是否为闰年
    
  • 相关阅读:
    tab选项卡
    为什么不高兴呢
    #pragma INITCODE 是什么意思
    驱动开发基础知识
    Windows的驱动开发模型
    分页内存和非分页内存区别
    WDF驱动模型
    博客启动描述
    struct和typedef struct
    数据解析代码
  • 原文地址:https://www.cnblogs.com/zeo-to-one/p/9357490.html
Copyright © 2011-2022 走看看