java 中的日期
你首先想到的处理它们需要什么API?
java.util.Datejava.util.Calendar
DateUtils
DateFormatUtils
DateParseUtils
Date和Calendar的痛苦
可变性:声明了的日期还可以改变吗?偏移性
年:1900开始?
月:0开始?MONTH_OF_YEAR
日:0开始?DAY_OF_MONTH
等等。。。
命名(自解释)
Date=日期?
Calendar=日历?
格式化:Calendar无法格式化
线程安全:非线程安全
Java8的java.time包
初识不可变
线程安全
包
java.time – 包含值对象的基础包
java.time.chrono – 提供对不同的日历系统的访问
java.time.format – 格式化和解析时间和日期
java.time.temporal – 包括底层框架和扩展特性
java.time.zone – 包含时区支持的类
日期:LocalDate
• 值类型(内容相同即equals,对比String)
• 它是表示日期的不可变类型,不包含时间和时区。
• 它所有的方法都是常用方法
• 使用工厂方法创建
• 枚举类型Month和DayOfWeek用来增强代码的可读、可靠性
日期:LocalDate常用操作
• 不可变:每次都会生成新的实例
• 线程安全:多线程
日期:LocalDate高级操作
• 对日期进行复杂操作时,使用修改器(java.time.TemporalAdjuster)
• 封装了常用高级操作
• 可使用LocalDate API封装自己的高级操作
时间:LocalTime
• 值类型
• 与日期、时间无关
• 以午夜为基准,24小时一个周期(22+6=4)
• 支持修改器
日期时间:LocalDateTime
• LocalDate+LocalTime的简单组合
• 创建:工厂类;LocalDate + LocalTime
日期时间:LocalDateTime常用API
• of:静态工厂方法,从组成部分中创建实例
• from:静态工厂方法,尝试从相似对象中提取实例。from()方法没有of()方法类型安全
• now:静态工厂方法,用当前时间创建实例
• parse:静态工厂方法,总字符串解析得到对象实例
• get:获取时间日期对象的部分状态
• is:检查关于时间日期对象的描述是否正确
• with:返回一个部分状态改变了的时间日期对象拷贝
• plus:返回一个时间增加了的、时间日期对象拷贝
• minus:返回一个时间减少了的、时间日期对象拷贝
• to:把当前时间日期对象转换成另外一个,可能会损失部分状态
• at:用当前时间日期对象组合另外一个,创建一个更大或更复杂的时间日期对象
• format:提供格式化时间日期对象的能力
时间点:Instant
• Java中,时间点的表示为从1970开始的毫秒数
• Instant
• 时间线上的一点,没有任何上下文信息(时区等)
• 精度为纳秒
时区Zone
• 从TimeZone到ZoneId
• LocalDate/LocalTime/LocalDateTime/Instant不用考虑时区
• 使用ZonedDateTime进行时区相关操作
时间长度
• 两种时间长度
• Duration表示以秒和纳秒为基准的时长。例如,“23.6秒”。
• Period表示以年、月、日衡量的时长。例如,“3年2个月零6天”
解析和格式化
• 专门的格式化类,将格式化从日期中分离
• 包含类
• java.time.format.DateTimeFormatter
• java.time.format.DateTimeFormatterBuilder
• 创建格式化器常用DateTimeFormatter中的常量和静态方法
• 常用ISO格式常量,如ISO_LOCAL_DATE
• 字母模式,如ofPattern(“dd/MM/uuuu”)
• 本地化样式,如ofLocalizedDate(FormatStyle.MEDIUM)