TemporalAdjuster是时间调节器,可以执行复杂的日期操作,例如,可以获得下一个星期日的日期、当月的最后一天(再也不用计算当月是28,29还是30天了)、下一年的第一天、下一个工作日等等。
ZonedDateTime与LocalDateTime区别
- LocalDateTime:这基本上是一个美化的字符串表示日期和时间;它与时区无关,这意味着它不代表时间轴上的任何时间点
- Instant:这是自EPOCH以来经过的时间的毫秒表示,即 时间戳。这表示时间轴上的特定时刻(注意:时间戳跟时区没有关系!)
- ZonedDateTime:这也表示时间轴上的某个时刻,但它表示为带有时区的日期和时间
- java.util.Date是用于表示一个日期和时间的对象(注意与java.sql.Date区分,后者用在数据库中没有格式化的Date),它打印出的日期可读性差,可以使用SimpleDateFormat对时间进行格式化,但SimpleDateFormat又是线程不安全,包括format和parse方法,而在时间的计算方面不是很方便。
- java.util.Canlendar 可以用于获取并设置年、月、日、时、分、秒,它和Date比,主要多了一个可以做简单的日期和时间运算的功能,Canlendar 变量是全局变量,会导致脏变量情况产生,并且这个共享变量没有做线程安全控制,也就是多线程的情况下是线程不安全的。
- Java8出的新的时间日期API都是线程安全的比如LocalDate、LocalTime、LocalDateTime这三个类,计算功能强大,并且性能更好,代码更简洁。
Java8时间类型的好处:
- 明确了日期、时间概念;例如:瞬间(instant)、 长短(duration)、日期、时间、时区和周期;
- 继承了Joda 库按人类语言和计算机各自解析的时间处理方式;
- 新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全;
Java中使用SimpleDateFormat类的构造函数SimpleDateFormat(String str)
构造格式化日期的格式,通过format(Date date)
方法将指定的日期(Date)对象格式化为指定格式的字符串。
Java中操作时间日期的类有:Date
(日期)、Calendar
(日历)、DateFormat
(日期格式)。
在日常系统开发中,相信你遇到过类似需要重复执行的任务,比如每天凌晨2点清理数据库某张表的垃圾数据,页面显示设备(服务器)运行状态也需要每隔3秒调用设备状态接口查询设备情况等,这些功能开发都需要用到定时器(Timer)
在需要按时间计划执行简单任务的情况下,Timer是最常被使用到的工具类。使用Timer来调度TimerTask的实现者来执行任务,有两种方式,一种是使任务在指定时间被执行一次,另一种是从某一指定时间开始周期性地执行任务。
最近在和同事讨论Java主线程和子线程之间的关系,自己也到网上搜索了下,发现各种答案都有,有些还是互相矛盾的。经过测试自己得出以下几个结论,跟大家分享下