convert.todatetime指定日期格式_JDK1.8新增日期时间类型

如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。Java1.0中包含了一个Date类,但是它的大多数方法已经在Java 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:

  • 可变性:象日期和时间这样的类应该是不可变的。Calendar类中可以使用三种方法更改日历字段:set()、add() 和 roll()。
  • 偏移性:Date中的年份是从1900开始的,而月份都是从0开始的。
  • 格式化:格式化只对Date有用,Calendar则不行。
  • 此外,它们也不是线程安全的,不能处理闰秒等。

Date的API:

尽管 Date 类打算反映协调世界时 (UTC),但无法做到如此准确,这取决于 Java 虚拟机的主机环境。当前几乎所有操作系统都假定 1 天 = 24 × 60 × 60 = 86400 秒。但对于 UTC,大约每一两年出现一次额外的一秒,称为“闰秒”。闰秒始终作为当天的最后一秒增加,并且始终在 12 月 31 日或 6 月 30 日增加。例如,1995 年的最后一分钟是 61 秒,因为增加了闰秒。大多数计算机时钟不是特别的准确,因此不能反映闰秒的差别。

在类 Date 所有可以接受或返回年、月、日期、小时、分钟和秒值的方法中,将使用下面的表示形式:

l 年份 y 由整数 y – 1900 表示。

l 月份由从 0 至 11 的整数表示;0 是一月、1 是二月等等;因此 11 是十二月。

l 日期(一月中的某天)按通常方式由整数 1 至 31 表示。

l 小时由从 0 至 23 的整数表示。因此,从午夜到 1 a.m. 的时间是 0 点,从中午到 1 p.m. 的时间是 12 点。

l 分钟按通常方式由 0 至 59 的整数表示。

l 秒由 0 至 61 的整数表示;值 60 和 61 只对闰秒发生,尽管那样,也只用在实际正确跟踪闰秒的 Java 实现中。于按当前引入闰秒的方式,两个闰秒在同一分钟内发生是极不可能的,但此规范遵循 ISO C 的日期和时间约定。

在所有情形中,针对这些目的赋予方法的参数不需要在指定的范围内;例如,可以把日期指定为 1 月 32 日,并把它解释为 2 月 1 日的相同含义。

Date date = new Date(2017-1900,8-1,28);

System.out.println(date);//Mon Aug 28 00:00:00 CST 2017

可以说,对日期和时间的操作一直是Java程序员最痛苦的地方之一。第三次引入的API是成功的,并且java 8中引入的java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。

Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。

  • time – 包含值对象的基础包
  • time.chrono – 提供对不同的日历系统的访问。
  • time.format – 格式化和解析时间和日期
  • time.temporal – 包括底层框架和扩展特性
  • time.zone – 包含时区支持的类

Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。新的 java.time 中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了了日期时间和本地化的管理。

说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一。

java.time

5fbfb01027ebf5c99c076519ae4b1021.png

注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法,也就是公历。

java.time.chrono

328109414d289d7e16b84a24eabfb7ef.png

java.time

1、本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)

LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。

LocalTime表示一个时间,而不是日期

LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。

描述

now() / now(ZoneId zone)

静态方法,根据当前时间创建对象/指定时区的对象

of()

静态方法,根据指定日期/时间创建对象

getDayOfMonth()/getDayOfYear()

获得月份天数(1-31) /获得年份天数(1-366)

getDayOfWeek()

获得星期几(返回一个 DayOfWeek 枚举值)

getMonth()

获得月份, 返回一个 Month 枚举值

getMonthValue() / getYear()

获得月份(1-12) /获得年份

getHours()/getMinute()/getSecond()

获得当前对象对应的小时、分钟、秒

withDayOfMonth()/withDayOfYear()/withMonth()/withYear()

将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象

with(TemporalAdjuster t)

将当前日期时间设置为校对器指定的日期时间

plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()

向当前对象添加几天、几周、几个月、几年、几小时

minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours()

从当前对象减去几月、几周、几天、几年、几小时

plus(TemporalAmount t)/minus(TemporalAmount t)

添加或减少一个 Duration 或 Period

isBefore()/isAfter()

比较两个 LocalDate

isLeapYear()

判断是否是闰年(在LocalDate类中声明)

format(DateTimeFormatter t)

格式化本地日期、时间,返回一个字符串

parse(Charsequence text)

将指定格式的字符串解析为日期、时间

//now()
@Test
public void testLocalDateTime(){
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime datetime = LocalDateTime.now();
}
//of()或parse
@Test
public void testLocalDate() {
// LocalDate date = LocalDate.now();
// LocalDate date = LocalDate.of(2017, 3, 20);
LocalDate date = LocalDate.parse(“2017-03-12”);
}
public static void main(String[] args) {
LocalDateTime t = LocalDateTime.now();
System.out.println(“这一天是这一年的第几天:”+t.getDayOfYear());
System.out.println(“年:”+t.getYear());
System.out.println(“月:”+t.getMonth());
System.out.println(“月份值:”+t.getMonthValue());
System.out.println(“日:”+t.getDayOfMonth());
System.out.println(“星期:”+t.getDayOfWeek());
System.out.println(“时:”+t.getHour());
System.out.println(“分:”+t.getMinute());
System.out.println(“秒:”+t.getSecond());
System.out.println(t.getMonthValue());
}
@Test
public void testLocalDate2() {
LocalDate date = LocalDate.now();
//withXxx()方法,不改变原来的date对象,返回一个新的对象,不可变性
// LocalDate date2 = date.withDayOfMonth(1);//获取这个月的第一天
LocalDate date2 = date.with(TemporalAdjusters.firstDayOfMonth());// 获取这个月的第一天
System.out.println(date2);
// 获取这个月的最后一天
LocalDate date3 = date.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(date3);
//45天后的日期
LocalDate date4 = date.plusDays(45);
System.out.println(date4);
//20天前的日期
LocalDate date5 = date.minusDays(20);
System.out.println(date5);
boolean before = date.isBefore(date5);
System.out.println(date+”是否比”+date5+”早” + before);
System.out.println(date+”是否是闰年:”+date.isLeapYear());
}
MonthDay month = MonthDay.of(8, 14);
MonthDay today = MonthDay.from(date);
System.out.println(“今天是否是生日:” + month.equals(today));

2、瞬时:Instant

Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。

在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。

java.time包通过值类型Instant提供机器视图。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。

b3bb90ad5dc60900fcd6e2a078b4f229.png

be3bd5d0e739b798f420e3bc39a754d5.png

时间戳:指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

public static void main(String[] args) {
Instant t = Instant.now();
System.out.println(t);
//偏移8个小时
OffsetDateTime atOffset = t.atOffset(ZoneOffset.ofHours(8));
System.out.println(atOffset);
long milli = t.toEpochMilli();
System.out.println(milli);
Instant in2 = Instant.ofEpochSecond(10000000);
System.out.println(in2);
}

3、带时区的日期、时间的处理

作为一个开发者,如果不用去处理时区和它带来的复杂性,那是幸运的。java.time包下的LocalDate、LocalTime、LocalDateTime和Instant基本能满足需求。当你不可避免时区时,ZonedDateTime等类可以满足我们的需求。

ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12-03T10:15:30+01:00 Europe/Paris。

  • 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如:Asia/Shanghai等
  • now():使用系统时间获取当前的ZonedDateTime
  • now(ZoneId):返回指定时区的ZonedDateTime

ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris

  • getAvailableZoneIds():静态方法,可以获取所有时区信息
  • of(String id):静态方法,用指定的时区信息获取ZoneId对象

Clock:使用时区提供对当前即时、日期和时间的访问的时钟。

public static void main(String[] args) {
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
for (String string : availableZoneIds) {
System.out.println(string);
}
ZonedDateTime t = ZonedDateTime.now();
System.out.println(t);
ZonedDateTime t1 = ZonedDateTime.now(ZoneId.of(“America/New_York”));
System.out.println(t1);
// Clock clock = Clock.systemDefaultZone();
Clock c = Clock.system(ZoneId.of(“America/New_York”));
System.out.println(c.getZone());
System.out.println(c.instant());
}

4、持续时间:Duration

Duration:用于计算两个“时间”间隔

public static void main(String[] args) {
LocalDateTime t1 = LocalDateTime.now();
LocalDateTime t2 = LocalDateTime.of(2017, 8, 29, 0, 0, 0, 0);
Duration between = Duration.between(t1, t2);
System.out.println(between);
System.out.println(“相差的总天数:”+between.toDays());
System.out.println(“相差的总小时数:”+between.toHours());
System.out.println(“相差的总分钟数:”+between.toMinutes());
System.out.println(“相差的总秒数:”+between.getSeconds());
System.out.println(“相差的总毫秒数:”+between.toMillis());
System.out.println(“相差的总纳秒数:”+between.toNanos());
System.out.println(“不够一秒的纳秒数:”+between.getNano());
}

5、日期间隔:Period

Period:用于计算两个“日期”间隔

public static void main(String[] args) {
LocalDate t1 = LocalDate.now();
LocalDate t2 = LocalDate.of(2018, 12, 31);
Period between = Period.between(t1, t2);
System.out.println(between);
System.out.println(“相差的年数:”+between.getYears());//1年
System.out.println(“相差的月数:”+between.getMonths());//又7个月
System.out.println(“相差的天数:”+between.getDays());//零25天
System.out.println(“相差的总数:”+between.toTotalMonths());//总共19个月
}

10.8.2 java.time.temporal .TemporalAdjuster : 时间校正器

TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。

TemporalAdjusters : 该类通过静态方法(firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的实现。

public static void main(String[] args) {
LocalDate now = LocalDate.now();
System.out.println(“下一个周日:”+now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)));
System.out.println(“下周五” + now.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));
System.out.println(“本月最后一天:”+now.with(TemporalAdjusters.lastDayOfMonth()));//2017-08-31
LocalDate week = LocalDate.now().with(new TemporalAdjuster(){
@Override
public Temporal adjustInto(Temporal temporal) {
LocalDate date = (LocalDate) temporal;
if(date.getDayOfWeek().equals(DayOfWeek.MONDAY)){
return date.plusDays(7);
}else if(date.getDayOfWeek().equals(DayOfWeek.TUESDAY)){
return date.plusDays(6);
}else if(date.getDayOfWeek().equals(DayOfWeek.WEDNESDAY)){
return date.plusDays(5);
}else if(date.getDayOfWeek().equals(DayOfWeek.THURSDAY)){
return date.plusDays(4);
}else if(date.getDayOfWeek().equals(DayOfWeek.FRIDAY)){
return date.plusDays(3);
}else if(date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){
return date.plusDays(2);
}else{
return date.plusDays(1);
}
}
});
System.out.println(“下一个工作日:” + week);
}

10.8.3 java.time.format.DateTimeFormatter 类

该类提供了三种格式化方法:

预定义的标准格式。如:ISO_DATE_TIME;ISO_DATE

本地化相关的格式。如:ofLocalizedDate(FormatStyle.MEDIUM)

自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

public static void main(String[] args) {
System.out.println(DateTimeFormatter.ISO_DATE.format(LocalDate.now()));
System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(LocalDateTime.now()));
//FULL和SHORT适用于LocalDate和LocalTime
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(LocalDate.now()));
System.out.println(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).format(LocalTime.now()));
//LONG和MEDIUM适用于LocalDateTime
System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).format(LocalDateTime.now()));
DateTimeFormatter op = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);
System.out.println(op.format(LocalDateTime.now()));
}

10.8.4 与传统日期处理的转换

9a205603bdd62a6b862a14ef65e2be0e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux shell运行脚本命令行参数,shell脚本命令行参数简介

之所以用到命令行参数&#xff0c;关键在于shell脚本需要与运行脚本的人员进行交互。bash shell提供了命令行参数添加在命令后面的数据值)、命令行选项修改命令行为的单字符值)和直接读取键盘输入。1、命令行参数向shell脚本传递数据的最基本方式是使用命令行参数。1)读取参数读…

eclipse linux远程调试工具,使用本地Eclipse IDE调试器与远程项目源(Linux)

我试图找出以下情况的最佳方法。我有几个Java源文件正在使用JNI与一些C源代码进行通信&#xff0c;这些源代码都驻留在Linux机器上。 Java部分在Linux机器上完美地构建和运行(通过JUnit)。 Java类依赖于几个Linux(.so)库。我想在本地计算机(Mac OS X)上运行Eclipse IDE调试器&a…

python下载文件的第三方库_Python常用第三方库(转载)

wxPython 如果你之前是 windows 程序员&#xff0c;用 MFC 或者 WIN32API 开发界面程序&#xff0c;那进入 Python 国度最好的 GUI 选择应该是 wxPython。它是 wxWidgets 的 Python Bind&#xff0c;与 wxWidgets 的开发完美同步&#xff0c;最为重要的一点是它的消息机制与 MF…

linux sybase 自动备份,Linux平台下Sybase数据库备份方法分析.doc

Linux平台下Sybase数据库备份方法分析Linux平台下Sybase数据库备份方法分析摘 要&#xff1a;对于从事信息系统管理的人员来说&#xff0c;掌握数据库的备份方法在工作中尤为重要。当本地数据出错或者磁盘损坏时&#xff0c;可以利用备份的数据恢复数据库系统&#xff0c;从而保…

facebook对话链接_如何应用防错原则,看看 Facebook 和 Gmail 是怎么做的

欢迎来到有言有料&#xff0c;让思考更有张力本文共 3873 字&#xff0c;预计阅读 10 分钟作者&#xff5c;Siddharth Gulati译者&#xff5c;张聿彤本文翻译已获得作者的正式授权(授权截图如下)在用户界面(UI)设计中&#xff0c;重要的是要注意最细微的细节&#xff0c;以使用…

linux 7 定时任务设置,centos7 配置crontab定时任务

1. 启动cron服务# 查看服务状态systemctl status crond# 启动systemctl start crond# 停止systemctl stop crond# 重启systemctl restart crond# 重新加载systemctl reload crond2. 开机自动启动cron服务systemctl start crond.service3. 通过crontab命令管理定时任务crontab命…

模拟灰度传感器循迹的程序_PLC编程,实例讲解西门子PLC模拟量编程

给大伙分享的是关于西门子S7-300PLC模拟量方面的实例&#xff0c;包含了以下几个方面的要点&#xff1a;1、对变送器进行取值&#xff0c;并进行控制2、对模数功能块 FC105 进行调用3、对 AI 模块进行设置4、对 AI 量程块进行选择这个实例&#xff0c; 调试的是一个流量调节回路…

linux mint 17 输入法,LinuxMint17.1 Rebecca中安装设置输入法

LinuxMint14使用了几年一直未更新&#xff0c;突然想去更新一下去发现源已经不支持了&#xff0c;所以就直接安装了最新版本。安装好以后发现还是跟以前一样的毛病&#xff0c;没有中文输入法&#xff0c;直接sudo aptitude install fcitx* 发现仍然不行。运行im-config设定FCI…

python组成不重复的三位数是多少_Python输出由1,2,3,4组成的互不相同且无重复的三位数...

题目&#xff1a;有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 程序源代码 方法1&…

作业调度C语言编写,【作业调度方案】 (C语言代码)

解题思路:如图所示&#xff0c;对于第一组样例输入&#xff0c;按照总工序提供的顺序&#xff0c;对于每个工件的工序从小到大&#xff0c;每次寻找有空闲机器的“空档”插入&#xff0c;就能让总加工时间最短。注意事项:按照约定&#xff0c;最短方案有且只有一种。参考代码:#…

python判断能否组成三角形_python三角形判定怎么做

python三角形判定怎么做&#xff1f;下面给大家带来具体的例子&#xff1a; 相关推荐&#xff1a;《Python视频教程》 例子&#xff1a;a int(input("The length of the side a ")) b int(input("The length of the side b ")) c int(input("The…

文件的记录c语言程序,c语言程序学生籍贯信息记录簿设计.docx

c 语言程序学生籍贯信息记录簿设计学生籍贯信息记录簿课程设计报告书班 级: 方 0909-1 学 号:姓 名: 苑 小 叶 指导教师 : 康 亚 男 石家庄铁道大学四方学院2010年 07月 14日1课程设计报告内容1. 选择题目题目: 学生籍贯信息记录簿设计 2. 内容摘要摘要:学生籍贯信息管理系统是…

如何修改linux的java路径_修改桌面文件默认存储位置的正确方式及注意事项

之前写了篇关于如何修改桌面文件默认存储位置&#xff0c;许多人在修改后出现各种问题&#xff0c;今天重新来讲解一下关于修改桌面文件默认存储位置的正确方式及注意事项。第一步、在E盘下创建一个文件夹&#xff0c;随便取个名字&#xff0c;或者默认为【新建文件夹】&#x…

secp256r1 c语言程序,rust代码阅读 之 libsecp256k1 (1)

在密码学的运算中, 数字通常是非常大的. 以 ECDSA 椭圆曲线为例, 私钥是 256 位的.所以在 libsecp256k1 这个库里, 定义了计算的元素 Field. 其中 n 为 320 位.pub struct Field {pub(crate) n: [u32; 10],pub(crate) magnitude: u32,pub(crate) normalized: bool,}为其实现加法…

python位运算符_详细介绍Python语言中的按位运算符

按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下&#xff1a; 按位与 ( bitwise and of x and y ) & 举例&#xff1a; 5&3 1 解释&#xff1a; 101 11 相同位仅为个位1 &#xff0c;故结果为 1 按位或 ( bitwise or of x and y ) | 举例&…

c语言代码测试电脑性能,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼易言版本……跑100000万成绩不如PHP。。。。.版本 2.程序集 程序集1.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行.局部变量 参数, 文本型, , "0".局部变量 to, 整数型.局部变量 fr, 整数型.局部变量 n,…

python find函数 和index的区别_使用带有find和index的map时Python2和Python3之间的区别...

给定一个模式和一个字符串str,找到str是否遵循相同的模式. 以下是完全匹配,使得在模式中的字母和str中的非空字之间存在双射. 例子&#xff1a; pattern “abba”,str “dog cat cat dog”应该返回true;狗是一只猫,猫是b,而这些词形成了abba模式. pattern “abba”,str “dog c…

c语言3368题目,电大《C语言程序设计课程》期末考试复习资料

0993C 评议程序设计A 第 1 页 共 31 页C 语言程序设计课程期末复习练习一、单选题 1&#xff0e;在每个C 语言程序中都必须包含有这样一个函数&#xff0c;该函数的函数名为( )。A. main 2&#xff0e;每个C 语言程序文件的编译错误分为( )类。B. 2 3. 字符串"ab12\n"…

【LeetCode】链表精选12题

目录 快慢指针&#xff1a; 1. 相交链表&#xff08;简单&#xff09; 2. 环形链表&#xff08;简单&#xff09; 3. 快乐数&#xff08;简单&#xff09; 4. 环形链表 II&#xff08;中等&#xff09; 5. 删除链表的倒数第 N 个节点&#xff08;中等&#xff09; 递归迭…

python类的属性和对象属性_python 类属性、对象属性-阿里云开发者社区

类的普通属性:  dir(Myclass), 返回一个key列表&#xff1b; Myclass.__dir__,返回一个字典&#xff1b; 1、类的数据属性&#xff1b; 2、类的方法&#xff1b; 类的特殊属性&#xff1a; 1、Myclass.__name__  类的名字 2、Myclass.__doc__   类的文档字符串 3、Mycla…