栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java基础——时间和日期

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java基础——时间和日期

时间和日期
  • 时间和日期是什么?
  • 时间线原点
  • 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 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);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/642835.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号