时间和日期

  • 时间和日期是什么?
  • 时间线原点
  • UTC和GMT
  • 夏令时
  • 获取距1970-1-1,00:00:00的毫秒
  • 获取当前时间或日期
    • 同时获取时间和日期
    • 只获取日期
    • 只获取时间
  • 加上时区
    • ZoneId
    • TimeZone
  • 格式化和解析
    • SimpleDateFormat
    • DateTimeFormatter
  • 其他

时间和日期是什么?

在java中用于操作时间的类有:

  • java.sql.Time (java.util.Date的子类,用于SQL)
  • java.sql.Timestamp(java.util.Date的子类,用于SQL)
  • java.security.Timestamp(用于并发)
  • java.time.LocalTime(JDK1.8

在java中用于操作日期的类有:

  • java.sql.Date(java.util.Date的子类,用于SQL)
  • java.time.LocalDate(JDK1.8

可同时操作时间日期的类有

  • java.util.Date(JDK1.0,已废弃
  • java.util.Calendar(JDK1.1
  • java.time.Instant(JDK1.8
  • java.time.LocalDateTime (JDK1.8
  • java.time.ZonedDateTime(JDK1.8

用于转换时间日期的类:

  • java.time.format.DateTimeFormatter(JDK1.8
  • java.text.DateFormat
  • java.text.SimpleDateFormat(java.text.DateFormat的子类)

下面的Date都是 java.util包下的,暂不介绍java.sql

时间线原点

时间线原点以伦敦格林威治皇家天文台的本初子午线所处时区的1970-1-1,00:00:00为准,每天为86400秒

UTC和GMT

  • GMT(Greenwish Mean Time)根据地球的自转和公转来计算时间,是格林威治的时区时间
  • UTC(Coordinated Universal Time) 根据原子钟来计算时间,是标准时间,不与任何地区位置相关,也不代表此刻某地的时间,所以在说明某地时间时要加上时区
  • GMT = UTC + 0

夏令时

夏令时(Daylight Saving Time:DST),指在天亮早的夏季人为将时间调快一小时(因为夏季太阳早升晚落,调快一小时可让人们早睡早起,节约电量,下面举例)

  • 假如夏天6点日出,7点日落
  • 平常人们9点起床,6点下班,7点开灯,11点关灯睡觉,开灯4小时
  • 调快一小时后人们实际8点起床,5点下班,还是7点开灯(因为日落),但是睡觉变成了10点,开灯3小时

各个国家具体规定不同,有近110个国家每年要实行夏令时,如我国曾在1986年-1991年执行过夏令时

  • 每年从四月中旬第一个星期日的凌晨2时整,将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;
  • 到九月中旬第一个星期日的凌晨2时整,再将时钟拨慢一小时,即将表针由2时拨至1时,夏令时结束。
  • 从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。

获取距1970-1-1,00:00:00的毫秒

下面打印如1638844316226,毫秒数通常没什么用

System.out.println(new Date().getTime());
System.out.println(System.currentTimeMillis());
System.out.println(Instant.now().toEpochMilli());

获取当前时间或日期

若未加上时区,则默认为距1970-1-1,00:00:00的GMT绝对时间

同时获取时间和日期

Date和Calendar打印如Tue Dec 07 02:46:14 GMT 2021

System.out.println(new Date());
System.out.println(new Date(System.currentTimeMillis()));
System.out.println(Calendar.getInstance().getTime());

Instant打印如2021-12-01T07:36:42.350Z,T表示分割,Z表示当前是UTC0,可为±

System.out.println(Instant.now());

LocalDateTime是不带时区的本地时间,如下打印2021-12-07T06:27:58.506

System.out.println(LocalDateTime.now());

ZonedDateTime是带时区的时间,如下打印2021-12-07T06:27:58.506Z[GMT],

System.out.println(ZonedDateTime.now());

只获取日期

LocalDate相当于截取了LocalDateTime中T的前半部分,如下打印2021-12-07

System.out.println(LocalDate.now());

只获取时间

LocalTime相当于截取了LocalDateTime的T到Z的后半部分,如下打印06:27:58.506

System.out.println(LocalTime.now());

加上时区

ZoneId

用于LocalTime、LocalDate、LocalDateTime、ZonedDateTime,可通过ZoneId.getAvailableZoneIds()获取全部ID,如America/New_York

Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
for (String availableZoneId : availableZoneIds) {System.out.println(availableZoneId);
}

加上时区后,打印如下,可知 New_York = GMT - 5

  • 2021-12-07T07:02:07.627Z[GMT]
  • 2021-12-07T02:02:07.654-05:00[America/New_York]
System.out.println(ZonedDateTime.now());
System.out.println(ZonedDateTime.now(ZoneId.of("America/New_York")));

TimeZone

用于Calendar,可通过TimeZone.getAvailableIDs()获取全部ID,如America/New_York

String[] availableIDs = TimeZone.getAvailableIDs();
for (String availableID : availableIDs) {System.out.println(availableID);
}

加上时区后,打印如下,可知 New_York = GMT - 5

  • Tue Dec 07 08:24:04 GMT 2021
  • Tue Dec 07 03:24:04 EST 2021
System.out.println(Calendar.getInstance().getTime());
TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
System.out.println(Calendar.getInstance().getTime());

格式化和解析

默认的时间格式通常不是我们所需要的,可通过定义字符串得到自己想要时间格式

SimpleDateFormat

用于Date,HH为24小时制,hh为12小时制(用a表示上下午),如下为转换

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("日期:yyyy年MM月dd日 时间:HH时mm分ss秒 时区偏移:Z");
System.out.println(simpleDateFormat.format(new Date()));

如下为解析

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("日期:yyyy年MM月dd日 时间:HH时mm分ss秒 时区偏移:Z");
String s = "日期:2021年12月07日 时间:08时42分15秒  时区偏移:+0000";
Date parse = null;
try {parse = simpleDateFormat.parse(s);
} catch (ParseException e) {e.printStackTrace();
}
System.out.println(parse);

DateTimeFormatter

用于LocalTime、LocalDate、LocalDateTime、ZonedDateTime,如下格式化ZonedDateTime

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("日期:yyyy年MM月dd日 时间:HH时mm分ss秒  时区偏移:Z");
System.out.println(dateTimeFormatter.format(ZonedDateTime.now()));

如下为解析

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("日期:yyyy年MM月dd日 时间:HH时mm分ss秒  时区偏移:Z");
String s = "日期:2021年12月07日 时间:08时42分15秒  时区偏移:+0000";
TemporalAccessor parse = dateTimeFormatter.parse(s);
System.out.println(ZonedDateTime.from(parse));

其他

计算算法所需时间示例

Instant start = Instant.now();
try {Thread.sleep(1000);
} catch (InterruptedException e) {e.printStackTrace();
}
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
long seconds = duration.getSeconds();
System.out.println(seconds);

Java基础——时间和日期相关推荐

  1. Java 8时间和日期API 20例

    本文由  ImportNew -  Sandy 翻译自  javarevisited.欢迎加入 翻译小组.转载请见文末要求. 伴随lambda表达式.streams以及一系列小优化,Java 8 推出 ...

  2. JAVA基础——时间Date类型转换

    在java中有六大时间类,分别是: 1.java.util包下的Date类, 2.java.sql包下的Date类, 3.java.text包下的DateFormat类,(抽象类) 4.java.te ...

  3. java键入时间hhmm_日期-SimpleDateFormat上的Java HH:mm和hh:mm之间的差异

    使用内置的本地化格式 如果这是为了向用户显示一天中的某个时间,那么在20个中的至少19个中,您无需关心DateTimeFormatter.hh或H.我建议您使用类似以下内容的方法: DateTimeF ...

  4. java 公元前时间_Java日期和时间类简介

    Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...

  5. 【java基础知识】日期类

    目录 1.Date类 构造方法 2.SimpleDateFormat类 format() 日期工具案例 3.Calendar类 二月天案例 1.Date类 构造方法 Date d1 = new Dat ...

  6. Java中的时间和日期(下)

    转载请注明出处:http://blog.csdn.net/wl9739/article/details/51882913 在上篇文章Java中的时间和日期(上)里面,简单介绍了Java中的Date类, ...

  7. Java基础篇(04):日期与时间API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.时间和日期 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分 ...

  8. java基础系列十七(时间日期转换)

    目录 一.概述 二.基础知识 2.1 时区 2.2 格林威治时间 2.3 时间戳 三.Date/Calendar/SimpleDateFormat 3.1 Date 3.2 Calendar 3.3 ...

  9. Java基础知识(二)(Object类的常用方法、日期时间类、System类、StringBuilder类、包装类、Collection集合、Iterator迭代器、泛型、list集Set接口...)

    文章目录 Java基础知识(二) 1.Object类的常用方法 1.1 toString方法 1.2 equals方法 1.3 Objects类 2.日期时间类 2.1 Date类 2.2 DateF ...

  10. Java基础之一组有用的类——生成日期和时间(TryDateFormats)

    控制台程序. java.util包中含有相当多的类涉及日期和时间,包括Date类.Calendar类和GregorianCalendar类. Date类对象其实定义了精确到毫秒的时刻,从1970年1月 ...

最新文章

  1. Redis 笔记(01)— 安装、启动配置、开启远程连接、设置密码、远程连接
  2. 计算机二级vb考试查分,全国计算机二级考试VB程序设计复习试题
  3. CG CTF MISC MD5
  4. CentOS 7.0变动
  5. C#LeetCode刷题之#104-二叉树的最大深度​​​​​​​(Maximum Depth of Binary Tree)
  6. IOS AppUI规格指南
  7. SQL Server2012安装教程
  8. (OS 10038)在一个非套接字上尝试了一个操作 的解决办法
  9. 批量修改python2.7版本print加括弧问题
  10. java+selenium自动化抓取51la数据
  11. split()方法的使用
  12. 根据下图实现类。在CylinderTest类中创建Cylinder类的对象,设置圆柱的底面半径和高,并输出圆柱的体积,继承性
  13. 每秒处理10万高并发订单的乐视集团支付系统架构分享【转】
  14. 上海航芯| BMS专题之BMS基础功能模块概述分享
  15. Bia布刷题日记2022/2/17
  16. main()的报错——疯狂递(而不)归
  17. 编程的50种基础算法代码,编程常用算法有哪些
  18. Python3 多线程threading处理xlsx/csv数据
  19. 百度索引量下降的原因及解决方法
  20. 搭建个人网站--优秀个人网站小结

热门文章

  1. Ajax的回调函数(callback)
  2. PC-DARTS 网络结构搜索程序分析
  3. BibTex中参考文献种类
  4. 根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
  5. unity与3dmax 单位统一的方法
  6. F - Pasha and Phone CodeForces - 595B(数学)
  7. 戴尔机架式服务器哪个型号好,戴尔_PowerEdge R540_机架式服务器参数_服务器推荐购买 | Dell 中国大陆...
  8. android-x86 地图,android 手机客户端百度地图 x86的jar包需要吗
  9. 写博客时怎么录制动态图片或者小视频
  10. 屏幕镜像显示无法连接服务器,Ios屏幕镜像连不上怎么办?