在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()); // 判断系统的年份是否为闰年

Java_日期时间相关类的更多相关文章

  1. java编程--04比较几个常用的日期时间相关类的区别

    第一篇,介绍日期的比较 第二篇,介绍日期的格式化 第三篇,介绍关于日期常用的计算 第四篇,比较几个常用的日期时间相关类的区别 第五篇,jdk9对日期类进行了更新,写一些i自己的学习心得. 下面以一组思 ...

  2. Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型

    本节重点思维导图 Date对象创建 两个构造函数: Date() ----使用当前日期和时间来初始化对象 Date(long millisec) -----接收一个参数,该参数是从1970年1月1日起 ...

  3. jdbc 日期时间相关的类型

    jdbc 日期时间相关的类型 1.sql.Date sql包中的日期类Date是util包中Date类的子类,实际上也是util.Date类的子集.它只处理年月日,而忽略小时和分秒,用以代表SQL的D ...

  4. 日期操作类--Date类

    Date-API ava.util包提供了Date类来封装当前的日期和时间.Date类提供两个构造函数来实例化Date对象.第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函 ...

  5. android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)

    第三节(2):常用控件之ViewPager.日期时间相关.ListView  一.ViewPager 实例:结合PagerAdapter滑动切换图片  二.日期时间相关:AnalogClock\Dig ...

  6. Android随笔之——Android时间、日期相关类和方法

    今天要讲的是Android里关于时间.日期相关类和方法.在Android中,跟时间.日期有关的类主要有Time.Calendar.Date三个类.而与日期格式化输出有关的DateFormat和Simp ...

  7. Java 日期格式化工具类

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  8. 日期操作类--SimpleDateFormat类

    使用SimpleDateFormat格式化日期 SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类.SimpleDateFormat允许你选择任何用户自定义日期时间格式来 ...

  9. 日期转换类 DateConverter.java

    package com.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.D ...

随机推荐

  1. 开发神器之PHPstorm配置及使用

    之前文章对于PHPstorm有了简单的介绍,作为一名合格的PHPer,一定要定制一个适合自己的IDE,然后开始我们的路途吧... 1. 为不同的项目选定PHP版本 我们经常会遇到这样的场景,不同的项目 ...

  2. 基于maven的spring-boot的pom文件详解

    Spring Boot 推荐的基础 POM 文件 名称 说明 spring-boot-starter 核心 POM,包含自动配置支持.日志库和对 YAML 配置文件的支持. spring-boot-s ...

  3. codeforces 1077F2. Pictures with Kittens (hard version)单调队列+dp

    被队友催着上(xun)分(lian),div3挑战一场蓝,大号给基佬紫了,结果从D开始他开始疯狂教我做人??表演如何AKdiv3???? 比赛场上:A 2 分钟,B题蜜汁乱计数,结果想得绕进去了20多 ...

  4. Linux基本命令总结(八)

    接上篇: 38,一次性定时计划任务的at命令的用法! 1.命令格式: at[参数][时间] 2.命令功能: 在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程(ps -ef | gr ...

  5. 洛谷P4155 BZOJP4444 [SCOI2015]国旗计划

    自己做出来的第一道倍增(fake) 原题链接 看到题目,贪心水题!不仅思维难度低,代码也好(难)写,三下五除二就写了出来,过了样例.但是一交,只有40pts.一道紫题能让我快速水40pts,良心出题人 ...

  6. Wannafly挑战赛23 T2游戏 SG函数

    哎,被卡科技了,想了三个小时,最后还是大佬给我说是\(SG\)函数. \(SG\)函数,用起来很简单,证明呢?(不可能的,这辈子都是不可能的) \(SG\)定理 游戏的\(SG\)函数就是各个子游戏的 ...

  7. 再也不用c++的string了

    今天打比赛,觉得写法没错,但死活过不了大样例.调试时发现用cin读入一行臭长臭长的string类型变量时出锅了,原来几千个字符就读进来500个,导致一直WAWAWAWAWA. 最后yyj神犇帮我就删掉 ...

  8. source insight如何删除没用的project 及其常见问题

    4年09月05日 ⁄ 综合 ⁄ 共 439字 ⁄ 字号 小 中 大 ⁄ 评论关闭 我正在中文路径下加载了一个工程,结果一点击打开,source insight程序就会出现错误提示,要求关闭.我想可能是 ...

  9. SQL随记(一)

    1.关于define表示定义 2.sql%rowcount用于记录修改的条数,必须放在一个CUD语句后面执行,无法在select中使用. 3.两种调用过程的关键字:exec和call 两者区别: (1 ...

  10. 【最强大的屏幕截图和标注工具】Snagit 2019.1 for Mac

    [简介] 今天和大家分享最新的 Snagit for Mac 2019.1 版本,这是Mac上最好用最强大的屏幕截图工具,Snagit功能非常强大,支持各种方式的屏幕截图,如全屏.滚动.部分.窗口.菜 ...