Java学习——日期与时间
Posted 没谱的曲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习——日期与时间相关的知识,希望对你有一定的参考价值。
日期与时间
时间是物质的运动、变化的持续性、顺序性的表现。
时区
以前,人们通过观察太阳位置决定时间。各地区经度不同导致各地区相应的时间也会有所不同。因此,在1863年,首次使用了时区这一概念。通过给这一地区设立一个标准的区域时间,来解决各地时间差异的问题。世界上各个地区因为日出日落时间有所偏差,就会导致时间的差异,这一差异就是所谓的“时差”。
世界协调时间(UTC)
不属于任意时区 。协调世界时,又称世界统一时间,世界标准时间,国际协调时间,简称UTC。
点击 此处可查看世界协调时间(UTC)。
世界时(GMT)
世界时UT即格林尼治平太阳时间,是指格林尼治所在地的标准时间,也是表示地球自转速率的一种形式,简称GMT。
点击 此处可查看格林威治时间(GMT)。
Unix时间戳(Unix Time)
unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
点击 此处使用Unix时间戳转换工具。
java日期函数
java日期函数是指Java统计从1970年1月1日起的毫秒的数量表示日期的函数。
SimpleDateFormat
父类是DateFormat,是一个抽象类
SimpleDateFormat允许进行格式化(日期>>文本):将Date对象转成方便阅读的字符串
解析(文本>>日期):把字符串形式的时间转成Date对象
SimpleDateFormat中定义并输出当前时间的两种方式:
public static void main(String[] args) throws ParseException
//创建当前时间对象
Date nowDate = new Date();
//创建一个日期格式
System.out.println("方法一:");
SimpleDateFormat test1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String time = test1.format(nowDate);
System.out.println(time);
System.out.println("方法二:");
String test2 = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(nowDate));
System.out.println(test2);
前后两种方法输出的时间和格式都相同:
解析(文本>>日期)把字符串形式的时间转换成Date对象:
//解析
//定义字符串
System.out.println("解析字符串:");
String str1 = "2021-03-29 10:32:30";
//创建格式(该格式要与字符串格式一致)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str1);
System.out.println("解析前字符串形式的时间:");
System.out.println(str1);
System.out.println("解析后date格式的时间:");
System.out.println(date);
输出结果如下图所示:
Calendar
Calendar可以直接翻译为日历,为诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,也为操作日历字段提供了一些方法。
注意:使用Calendar时,month是从0开始计算的,而正常计时中,月份是从一月开始的,所以打印时间时为避免产生误会,需要将month加一。
获取今天的日期:
// 获取当前的日历时间
Calendar c = Calendar.getInstance();
// 获取年
int year = c.get(Calendar.YEAR);
// 获取月
int month = c.get(Calendar.MONTH);
// 获取日
int date = c.get(Calendar.DATE);
System.out.println("-----今天-----");
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
输出结果:
使用add();方法修改年,以获取过去或以后的年:
// 十年前的今天
c.add(Calendar.YEAR, -10);
// 获取年
year = c.get(Calendar.YEAR);
// 获取月
month = c.get(Calendar.MONTH);
// 获取日
date = c.get(Calendar.DATE);
System.out.println("-----十年前的今天-----");
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
输出结果:
使用同样的方法可访问不同时间的年月日:
// 3年后的2月后5天前
c.add(Calendar.YEAR, 3);
c.add(Calendar.MONTH,2);
c.add(Calendar.DATE, -5);
// 获取年
year = c.get(Calendar.YEAR);
// 获取月
month = c.get(Calendar.MONTH);
// 获取日
date = c.get(Calendar.DATE);
System.out.println("-----3年后的5天前-----");
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
System.out.println("--------------");
输出结果:
直接使用set();方法可以直接对年、月、日进行赋值操作:
// 赛博朋克
c.set(2077, 6, 7);
// 获取年
year = c.get(Calendar.YEAR);
// 获取月
month = c.get(Calendar.MONTH);
// 获取日
date = c.get(Calendar.DATE);
System.out.println("-----赛博朋克-----");
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
输出结果:
LocalDate、LocalTime、LocalDateTime
LocalDate | LocalTime | LocalDateTime |
---|---|---|
代表ios格式(yyyy-MM-dd)的日期,可以存储生日、纪念日等日期。 | 表示一个时间,而不是日期。 | 是用来表示日期和时间的,这是最常用的类之一。 |
三种时间的表示方式的使用:
//获取当前日期或者时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("输出日期:");
System.out.println(localDate);
System.out.println("输出日期加时间:");
System.out.println(localDateTime);
System.out.println("输出时间:");
System.out.println(localTime);
输出结果:
使用of();方法自定义日期和时间:
//of();
try
LocalDate localDate2 = LocalDate.of(2222, 02, 23);
LocalDateTime localDateTime1 = LocalDateTime.of(2222, 02, 22, 22, 22, 22);
System.out.println("输出自定义日期、时间:");
System.out.println(localDateTime1);
System.out.println("输出自定义日期:");
System.out.println(localDate2);
catch (Exception e)
System.out.println("错了");
输出结果:
其他方法:
//.get
//获取当前日期属性
System.out.println("获取当前日信息:");
System.out.println(localDateTime.getDayOfMonth());
System.out.println("获取当前月信息:");
System.out.println(localDateTime.getMonthValue());
//with设置相关属性 体现不可变性 修改不影响原来的值
LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(22);
System.out.println("with设置属性,修改不影响原本值");
System.out.println(localDateTime);
System.out.println(localDateTime2);
//加减
System.out.println("plus、minus加减相关属性");
LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
System.out.println(localDateTime3);
LocalDateTime localDateTime4 = localDateTime.minusYears(10);
System.out.println(localDateTime4);
输出结果:
Instant
- Instant:时间线上的一个瞬时点。这可能被用来记录应用程序中的时间时间戳。
- 在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。
- java.time包通过值类型Instant提供机器视图,不提供处理人英意义上的时 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
- (1 ns = 10-9s)1秒=1000毫秒=106微秒=109纳秒。
Instant中的方法:
- now() 静态方法,返回默认UTC时区的Instant类的对象
- atOffset(ZoneOffset offset) 结合即时的偏移来创建一个 OffsetDateTime
- toEpochMilli() 返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
- ofEpochMilli(long epochMilli) 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
示例:
Instant instant = Instant.now();//获取本初子午线时间
System.out.println("-----本初子午线时间-----");
System.out.println(instant);
//结合即时的偏移来创建一个 OffsetDateTime;添加时间偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println("-----添加时间偏移量-----");
System.out.println(offsetDateTime);
//获取1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
long milli = instant.toEpochMilli();
System.out.println("-----获取1970.01.01 00:00:00到当前的毫秒数-----");
System.out.println(milli);
Instant instant1 = Instant.ofEpochMilli((161));
System.out.println("-----添加指定的毫秒数-----");
System.out.println(instant1);
//给定特定的毫秒数,获取Instant实例
OffsetDateTime offsetDateTime1 = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println("-----添加指定的偏移量-----");
System.out.println(offsetDateTime1);
//给定特定的秒数,获取Instant实例
Instant instant2 = Instant.ofEpochSecond(instant.getEpochSecond());
System.out.println("-----给定特定的秒数,获取Instant实例-----");
System.out.println(instant2);
运行结果:
总结:
本博文中仅归纳了部分在Java中的日期与时间的内容,其中只例举了一些容易理解和容易掌握的方法,还有很多方法没有例举出来,在今后的学习过程中会再进一步的学习和理解,丰富该部分的内容。
以上是关于Java学习——日期与时间的主要内容,如果未能解决你的问题,请参考以下文章