LocalDateTime的基本使用

LocalDateTime基本介绍

从名字上可以看出来java.time.LocalDateTime是一个可以表示日期时间的对象,代表日期时间,通常被视为年 - 月 - 日 - 时 - 分 - 秒,也提供了其他日期和时间字段,例如星期。LocalDateTime的时间精度为纳秒精度(1秒=1000毫秒,1毫秒=1000微秒,1微秒=1000纳秒)。

打开jdk8的api文档,找到java.time.LocalDateTime,分别了解它的构造方法、静态方法及对象方法等 。

java.time.LocalDateTime没有公开的构造方法,需要通过静态方法创建java.time.LocalDateTime对象。

静态方法(部分)如下:
LocalDateTime的基本使用

什么是时区?

引用百度百科:地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便。

为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1—12区,西1—12区。每个时区的*经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。

例如,中国东8区的时间总比泰国东7区的时间早1小时,而比日本东9区的时间晚1小时。因此,出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致。凡向西走,每过一个时区,就要把表拨慢1小时(比如2点拨到1点);凡向东走,每过一个时区,就要把表拨快1小时(比如1点拨到2点)。并且规定英国(格林尼治天文台旧址)为本初子午线,即零度经线。

下图来源于:https://24timezones.com
LocalDateTime的基本使用

根据时区创建日期时间对象

通过时区的id可确定一个时区,时区ID列表如下:

EST - -05:00
HST - -10:00
MST - -07:00
ACT - Australia/Darwin
AET - Australia/Sydney
AGT - America/Argentina/Buenos_Aires
ART - Africa/Cairo
AST - America/Anchorage
BET - America/Sao_Paulo
BST - Asia/Dhaka
CAT - Africa/Harare
CNT - America/St_Johns
CST - America/Chicago
CTT - Asia/Shanghai
EAT - Africa/Addis_Ababa
ECT - Europe/Paris
IET - America/Indiana/Indianapolis
IST - Asia/Kolkata
JST - Asia/Tokyo
MIT - Pacific/Apia
NET - Asia/Yerevan
NST - Pacific/Auckland
PLT - Asia/Karachi
PNT - America/Phoenix
PRT - America/Puerto_Rico
PST - America/Los_Angeles
SST - Pacific/Guadalcanal
VST - Asia/Ho_Chi_Minh

Asia/Shanghai:亚洲上海

America/Los_Angeles:美国/洛杉矶

基于时区创建LocalDateTime的方法如下:

package com.pbteach.javase.oop.dateapi;

import java.time.LocalDateTime;
import java.time.ZoneId;


/**
 * 日期时间类测试 
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class LocalDateTimeTest {

	//创建LocalDateTime对象
	public static void test1() {
		//使用now方法创建localDateTime对象
		LocalDateTime now = LocalDateTime.now();
		//基于默认时区创建,基于亚洲/上海(东八区)
		LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
		System.out.println(localDateTime);
		//基于美国洛杉矶时区创建
		LocalDateTime localDateTime2 = LocalDateTime.now(ZoneId.of("America/Los_Angeles"));
		System.out.println(localDateTime2);
	}
	public static void main(String[] args) {
		test1();
	}
}

ZoneId.of(“Asia/Shanghai”)表示得到一个时区ID(对象),也可以写为如下方式:

//基于亚洲/上海(东八区)
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
LocalDateTime localDateTime = LocalDateTime.now(zoneId);

输出:

2021-01-25T18:04:47.043
2021-01-25T02:04:47.045

(此时间为教程编写此部分时的时间,以运行程序时当前时间为准 )

为什么中间会有一个大写字母“T”?

查看localDateTime的源代码:
LocalDateTime的基本使用
按照ISO-8601要求,日期和时间为两部分内容,时间部分从大写字母“T”开始。

通过时间毫秒数创建LocaldateTime

首先解释什么是时间毫秒数,时间 毫秒数是从1970年1月1日零点到现在所经历的毫秒数,1970年1月1日是计算机中规定的时间起点纪元。很多时间系统之间交互时传递的日期时间值就是一个时间毫秒数,需要研究如何在时间 毫秒数和LocaldateTime之间进行转换,方便我们进行日期时间的操作,如何转换呢?

获取时间毫秒数的方式:

//第一种
long currentTimeMillis = System.currentTimeMillis();
//第二种
Instant now = Instant.now();
long epochMilli = now.toEpochMilli();

如何将时间 毫秒数转为LocaldateTime呢?

使用LocaldateTime的ofInstant静态方法进行转换:

//ZoneId表示时区id
static LocalDateTime ofInstant(Instant instant, ZoneId zone)  

Instant:表示一个瞬时点,它提供根据毫秒创建Instant对象的静态方法:

static Instant ofEpochMilli(long epochMilli)  

代码如下:

package com.pbteach.javase.oop.dateapi;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;


/**
 * 日期时间类测试 
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class LocalDateTimeTest {

	//通过long毫秒数创建LocaldateTime
	public static void test2() {
		//获取当前时间毫秒值
		long currentTimeMillis = System.currentTimeMillis();
		System.out.println(currentTimeMillis);
		//创建Instant瞬时对象
		Instant instant = Instant.ofEpochMilli(currentTimeMillis);
		//获取默认时区即Asia/Shanghai
		ZoneId zone = ZoneId.systemDefault();//或ZoneId.of("Asia/Shanghai")
		//将long毫秒值转为LocalDateTime对象
		LocalDateTime ofInstant = LocalDateTime.ofInstant(instant, zone);
		System.out.println(ofInstant);
	}
	
	public static void main(String[] args) {
		test2();
	}

}

输出:

1611570393961
2021-01-25T18:26:33.961

第一行输出的是当前时间的毫秒值,第二行输出的是毫秒值转为LocalDateTime对象后的输出信息。

(此时间为教程编写此部分时的时间,以运行程序时当前时间为准 )

LocaldateTime转为毫秒值

下边代码实现了LocaldateTime转为时间毫秒值:

//将LocalDateTime转成时间毫秒数
	public static void test3() {
		LocalDateTime localDateTime = LocalDateTime.now();
		System.out.println(localDateTime);
		//使用atZone方法先得到一个ZonedDateTime对象(带时区的)
		ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
		Instant instant = zonedDateTime.toInstant();
		//转成毫秒数
		long timeMillis = instant.toEpochMilli();
		System.out.println(timeMillis);
	}

配套视频

传智燕青Java基础精讲教程带你从零基础自学Java到大牛课程开放下载

上一篇:本机上使用Three.js加载纹理


下一篇:日期时间工具类DateTimeUtil(基于Java8的LocalDateTime)