ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LocalDateTime的基本使用

2021-02-13 11:31:37  阅读:385  来源: 互联网

标签:基本 LocalDateTime Asia ZoneId 毫秒 时间 使用 America


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到大牛课程开放下载

标签:基本,LocalDateTime,Asia,ZoneId,毫秒,时间,使用,America
来源: https://blog.csdn.net/weixin_44062339/article/details/113799915

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有