LocalDateTime的基本使用

LocalDateTime基本介绍

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

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

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

静态方法(部分)如下:
在这里插入图片描述

什么是时区?

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

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

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

下图来源于:https://24timezones.com
在这里插入图片描述

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

通过时区的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的源代码:
在这里插入图片描述
按照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到大牛课程开放下载

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
LocalDateTimeJava 8中的一个类,用于表示日期和时间。创建LocalDateTime对象的方法有几种。 首先,可以使用now方法创建当前的LocalDateTime对象。这个方法会根据系统默认的时区创建对象。例如,在代码中使用LocalDateTime.now()就可以创建当前的LocalDateTime对象。 其次,可以使用now方法并传入一个特定的时区来创建LocalDateTime对象。比如,使用LocalDateTime.now(ZoneId.of("Asia/Shanghai"))可以创建基于亚洲/上海时区的LocalDateTime对象。同样地,使用LocalDateTime.now(ZoneId.of("America/Los_Angeles"))可以创建基于美国洛杉矶时区的LocalDateTime对象。 另外,可以使用LocalDateTime.parse(String, formatter)方法将一个字符串转换为LocalDateTime对象。这个方法需要传入一个DateTimeFormatter实例作为第二个参数,用来指定字符串的日期模式。 此外,还可以使用format()方法将一个LocalDateTime对象格式化为字符串。这个方法是非静态方法,需要在一个LocalDateTime对象上调用。使用DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm")来创建一个DateTimeFormatter实例来指定日期模式,然后使用LocalDateTime对象的format()方法将其格式化为指定模式的字符串。例如:DateTimeFormatter aFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm"); LocalDateTime localDateTime = LocalDateTime.of(2017, Month.AUGUST, 3, 12, 30); String formattedString = localDateTime.format(aFormatter); 总结一下,使用now方法可以创建当前的LocalDateTime对象,也可以传入一个特定的时区来创建。使用parse方法可以将字符串转换为LocalDateTime对象,使用format方法可以将LocalDateTime对象格式化为字符串。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [LocalDateTime基本使用](https://blog.csdn.net/weixin_44062339/article/details/113799915)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程](https://blog.csdn.net/dnc8371/article/details/106702406)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值