Java 常用类-程序员头大的日期时间API
第二节、日期时间API
一、JDK8之前日期时间API
1.1 java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
此方法适于计算时间差。
@Test
public void test1() {
// 获取当前时间;
// 返回的是距离1970年的一个long型的数【毫秒数】,这种毫秒数通常称为时间戳,通常用于生成订单
long timeMillis = System.currentTimeMillis();
System.out.println(timeMillis);
}
// 运行结果
1601090613188
1.2 java.util.Date类
java.util.Date类还有一个子类java.sql.Date类,对应着数据库中的日期类型的变量。也就是说我们需要用java.sql.Date来表示数据库中的date类型
表示特定的瞬间,精确到毫秒
- 构造器:
- Date():使用无参构造器创建的对象可以获取本地当前时间。
- Date(long date) :创建指定毫秒数的Date对象
- 常用方法
- getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象 表示的毫秒数。(时间戳)
- toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。
- 其它很多方法都过时了
@Test
public void test2() {
// 获取当前时间
Date date = new Date();
System.out.println(date.toString());
// 将日期时间格式转为时间戳格式
long time = date.getTime();
System.out.println(time);
}
1.3 java.text.SimpleDateFormat类
理论:
Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
它允许进行格式化:日期——>文本。解析:文本——>日期
格式化:
SimpleDateFormat() :默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern):该构造方法可以用参数pattern 指定的格式创建一个对象,该对象调用:
public String format(Date date):方法格式化时间对象date
解析:
public Date parse(String source):从给定字符串的开始解析文本,以生成 一个日期
代码:
@Test
public void test7() throws ParseException {
// 1.0 将日期格式化为指定格式
Date date = new Date();
System.out.println(date);
/**
* 构造器的参数可以有参也可以无参,无参那个缺乏灵活性。通常都用有参的这个构造器,自己制定格式,如:
* 1. yyyy-MM-dd hh:mm:ss 年4位 月2位【为了和分钟区别开,建议大写】 日2位 时分秒各2位
* 2. yyyy年MM月dd日 hh时mm分ss秒
*/
// SimpleDateFormat formatPattern = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat formatPattern = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
String formatDate = formatPattern.format(date);
System.out.println(formatDate); System.out.println("--------------我是分割线---------------"); // 2.0 将字符串解析为日期
String strDate = "2020/10/01";
// 注意:这里需要指定类型,并且类型与字符串类型需一致。不然会报一个ParseException异常。
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
Date parse = format.parse(strDate);
System.out.println(parse);
}
问题:
如何将String str = "2020-11-11" 转换为java.sql.Date格式?
思路1:先把str转为java.util.Date下的日期格式,再强制类型转换
@Test
public void test8() throws ParseException {
String str = "2020-11-11";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 思路1:强制类型转换
java.sql.Date parse = (java.sql.Date)format.parse(str);
System.out.println(parse);
}
报错:java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date 无法强制类型转为java.sql.Date格式。
分析原因:平常我们做的强制类型转换是父类引用指向子类对象,再加强转即可【多态】。如:
Date date = new java.sql.Date(1601090613188L);
java.sql.Date date1 = (java.sql.Date) date;
System.out.println(date1);
现在这个之所以会失败,是因为我们相当于new了一个父类,直接将父类强制转换为子类,这当然是错的。【子类中有其他属性、方法,父类中没有,当然这种强制类型当然会失败】
思路2:通过时间戳
@Test
public void test9() throws ParseException {
String str = "2020-11-11";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 思路2:通过时间戳。【无论util下的Date还是sql下的Date都有时间戳,让时间戳做中间商】
Date parse = format.parse(str);
long time = parse.getTime();
java.sql.Date date = new java.sql.Date(time);
System.out.println(date);
}
1.4 java.util.Calendar(日历)类
Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
获取Calendar实例的方法
- 使用Calendar.getInstance()方法
- 调用它的子类GregorianCalendar的构造器
一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想 要的时间信息。。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、 MINUTE、SECOND
- public void set(int field,int value)
- public void add(int field,int amount)
- public final Date getTime()
- public final void setTime(Date date)
注意:
- 获取月份时:一月是0,二月是1,以此类推,12月是11
- 获取星期时:周日是1,周二是2 , 。。。。周六是7
代码
@Test
public void test10() {
// 获取Calendar实例
Calendar calendar = Calendar.getInstance(); // 获取今天是今年的第几天
int yearDay = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println("今天是今年的第:"+yearDay+"天");
// 获取今天是这个月的第几天
int monthDay = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("今天是这个月的第:"+monthDay+"天");
// 获取今天是本周的第几天【注意这里加了1的】
int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("今天是本周的第几:"+(weekDay-1)+"天"); // public void set(int field,int value) 改值
calendar.set(Calendar.DAY_OF_YEAR,1);
int yearDayChange = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println("我把今天是今年的第"+yearDay+"天,改为今天是今年的第"+yearDayChange+"天"); // public void add(int field,int amount) 在原本的基础上加
calendar.set(Calendar.DAY_OF_MONTH,5);
int monthAddDay = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("今天是这个月的第:"+monthAddDay+"天,然而我加了5天时间"); System.out.println("================不是分割线================"); // getTime() 相当于把日历——>new Date();
Date time = calendar.getTime();
System.out.println(time); // setTime() 相当于new Date()——>日历
Date date = new Date();
calendar.setTime(date);
System.out.println(date);
}
二、JDK8中的日期时间API
- 第三次引入的API是成功的,并且Java 8中引入的java.time API 已经纠正了 过去的缺陷,将来很长一段时间内它都会为我们服务。
- Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。 新的 java.time 中包含了所有关于本地日期(LocalDate)、本地时间 (LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime) 和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法, 用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简 化了日期时间和本地化的管理。
2.1 新时间日期API
- java.time – 包含值对象的基础包
- java.time.chrono – 提供对不同的日历系统的访问
- java.time.format – 格式化和解析时间和日期
- java.time.temporal – 包括底层框架和扩展特性
- java.time.zone – 包含时区支持的
说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽 管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一。
2.2 LocalDate、LocalTime、LocalDateTime
- LocalDate、LocalTime、LocalDateTime 类是其中较重要的几个类,它们的实例 是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。 它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区 相关的信息。
- LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
- LocalTime表示一个时间,而不是日期。
- LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。
2.3 常用方法
now() 静态方法,根据当前时间创建对象/指定时区的对象
@Test
public void test1() {
// 1. 获取当前日期
LocalDate nowDate = LocalDate.now();
// 2. 获取当前时间
LocalTime nowTime = LocalTime.now();
// 3. 获取当前日期时间
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("当前日期是:"+nowDate);
System.out.println("当前时间是:"+nowTime);
System.out.println("当前日期时间是:"+nowDateTime);
}
of(),静态方法,根据指定日期/时间创建对象
@Test
public void test2() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 12, 12, 12);
System.out.println(localDateTime);
}
getDayOfMonth()/getDayOfYear(),获得月份天数(1-31) /获得年份天数(1-366)
@Test
public void test3() {
LocalDateTime localDateTime = LocalDateTime.now();
// 1.获得该月的第几天
int dayOfMonth = localDateTime.getDayOfMonth();
System.out.println("今天是该月的第:" + dayOfMonth + "天");
// 2. 获得该年的第几天
int dayOfYear = localDateTime.getDayOfYear();
System.out.println("今天是该年的第:"+dayOfYear+"天");
}
2.4 瞬时:Instant
Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是 时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中, 也是从1970年开始,但以毫秒为单位。
java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒 数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级
(1 ns = 10-9 s) 1秒 = 1000毫秒 =106微秒=109纳秒
API
2.5 格式化与解析日期或时间
java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:
预定义的标准格式。如
- ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
- 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
- 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
代码:
@Test
public void test4() {
// DateTimeFormatter 格式化与解析日期或时间
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now();
// 格式化
String format = dateTimeFormatter.format(localDateTime);
System.out.println(format);// 2020-10-02 10:52:13
//解析
TemporalAccessor parse = dateTimeFormatter.parse("2020-10-02 10:52:13");
System.out.println(parse);
}
Java 常用类-程序员头大的日期时间API的更多相关文章
- Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
通过Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter, 可以看出java8的DateTimeFormatter完美解决 ...
- Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。
通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneI ...
- Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析
目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总 ...
- Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等
从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...
- Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate
通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用ja ...
- Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点
1.不变性 新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处. 比如:LocalDateTime 2.关注点分离 新的API将人可读的日期时间和机器时间(unix timestamp ...
- Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter
1.DateTimeFormatter final修饰,线程安全,用于打印和解析日期-时间对象的格式化程序. 创建DateTimeFormatter: DateTimeFormatter dateTi ...
- Java日期时间API系列21-----Jdk8中java.time包中的新的日期时间API类,xk-time时间转换,计算,格式化,解析的工具
通过工作之余,对Java8中java.time包源码的不断学习,使用和总结,开发了xk-time,初步完成,欢迎试用和提出建议! xk-time xk-time is a datetime conve ...
随机推荐
- 【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- 《MySQL数据库》MySQL ERRORLOG,BINLOG,SLOWLOG日志详解
前言 MySQL 经常出现启动错误或者执行错误等等,这个时候我们需要查询error日志 在数据库使用中,经常会出现需要恢复数据的情况,MySQL如果需要恢复数据的话需要开启binlog(二进制日志). ...
- 力扣Leetcode 33. 搜索旋转排序数组
33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值, ...
- 23种设计模式 - 接口隔离(Facade - Proxy - Mediator - Adapter)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 接口隔离 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接( ...
- 科赫雪花利用python海龟绘图代码
#KochDraw.py import turtle //海龟绘图 def koch(size, n): if n == 0: turtle.fd(size) else: for angle in [ ...
- 使用服务进程启动asp.net core程序
昨天在PuTTY中启动了测试网站,因为时间太晚,看到效果,立马关机睡觉,刚上床又想看看手机端访问效果,结果一打开,发现nginx找不到页面,意识到应该是退出PuTTY导致进程结束,于是今天赶紧查了解决 ...
- unity webview
uniwebview http://uniwebview.onevcat.com/manual Unity3D研究院之在Android中打开WebView(三十) http://www.xuanyus ...
- iOS 64位静态链接库
https://www.jianshu.com/p/486e3b737707 https://stackoverflow.com/questions/44635297/setting-an-ios-s ...
- JavaScript 时间都去那了(操作时间字符串加减时间)
---给时间充点时间吧--- 时间转换函数: function dateFormat(date, format) { date = new Date(date); var o = { 'M+': da ...
- Educational Codeforces Round 68 (Rated for Div. 2)-D. 1-2-K Game
output standard output Alice and Bob play a game. There is a paper strip which is divided into n + 1 ...