拒绝旧的捆绑类
避免捆绑 java.util.Date、java.util.Calendar 和 java.text.DateFormat/SimpleDateFormat 类。它们是出了名的麻烦。
是的,Joda-Time
是的,Joda-Time 2.3 有满足您需求的课程。
DateTime 代表一个时刻。请参阅 Period、Duration 和 Interval 类,它们都与时间跨度相关。
日期时间类
DateTime 代表一个时刻以及一个时区。与 似乎 有一个时区但实际上没有的 java.util.Date 不同,DateTime 确实分配了一个时区。几乎总是最好指定时区,否则你会得到 JVM 的默认时区。
期间类
ISO 8601 标准定义了一种表示时间跨度的文本方式,称为Duration。使用这种格式:PnYnMnDTnHnMnS。为了更加灵活,您可以存储PT3H,而不是存储三个小时的整数,其中“P”表示周期,“T”表示时间部分,“3H”表示三个小时。在 Joda-Time 中,Period 类将该字符串作为构造函数,并在调用 toString 时将其输出。因此,制作日历的一种方法是存储 DateTime(开始)和 ISO 字符串“Duration”。
Period period = new Period( "PT3H" );
持续时间类
另一种常用方法是以毫秒为单位存储持续时间。这基本上是 Joda-Time 中的 Duration 字段所做的,包含毫秒计数。
间隔类
在 Joda-Time 中的 Interval 中表示具有特定日期时间开始和日期时间结束的跨度。您可能不想存储它,但实例化此类对象可能有其他用途。此类提供了方便的方法,例如“重叠”和containsNow。如果“containsNow”返回 true,您就知道该事件正在发生。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime startDateTime = new DateTime( 2014, 1, 23, 14, 0, 0, timeZone );
Interval interval = new Interval( startDateTime, period );
转储到控制台...
System.out.println( "interval: " + interval );
运行时……
interval: 2014-01-23T14:00:00.000+01:00/2014-01-23T17:00:00.000+01:00
是 java.time.*
Java 8 带来了由JSR 310 定义的类的新java.time.* package。这些课程的灵感来自 Joda-Time,但经过完全重新设计。
您现在可以使用 Joda-Time 并继续使用 Java 8,因为该项目将继续得到积极维护。稍后您将学习过渡到 java.time 包。