从Java日历迁移到Joda日期时间

以前,当我第一次设计股票应用程序相关软件时,我决定使用java.util.Date来表示股票的日期/时间信息。

后来,我意识到java.util.Date大多数方法java.util.Date弃用。 因此,很快,我重构了所有代码以使用java.util.Calendar

但是,我遇到了两个缺点。

  1. 构造java.util.Calendarjava.util.Date
  2. Stock类的访问器getCalendar方法中,我需要克隆一个副本,因为Calendar是一个可变类

这是Stock.java的当前源代码

最近,我发现了Joda-Time 。 我通过创建1,000,000 java.util.Datejava.util.Calendarorg.joda.time.DateTime进行以下基准测试。 在实例化期间,我发现org.joda.time.DateTimejava.util.Calendar表现更好。

这是基准测试 替代文字 结果。

此实例化速度很重要,尤其是将创建许多Stocks实例,以表示股票的长期价格历史。

您认为从Java Calendar迁移到Joda Date Time是否值得获得应用程序速度性能? 我需要注意什么陷阱?

请注意, java.util.Date也是可变的 – 所以如果现在你正在使用Calendar ,那么使用Date也会出现问题。 也就是说,使用Joda Time 绝对值得做,因为它是一个更好,更好的API。

您的特定应用程序中的性能实际上是一个问题,您有多确定? 你说Stock会有“很多实例”……有多少? 你有没有描述过它? 我不希望它在大多数情况下实际上有显着差异。 从您的基准测试图中看,您实际测量的内容并不明显。

转移到Joda Time一般来说是一个好主意,但我会测量性能,看看它真正给你带来了多大的不同。

为什么在Stock类中需要一个Calendar ? 我认为使用Date代表一个时间点是好的。 这似乎是你想要的,因为如果忽略不推荐使用的方法,你希望库存中的Calendar对象是不可变的, Date类应该是不可变的。

当您需要在Stock类之外的Date上执行时间操作时,可以使用临时Calendar

 Calendar calendar = Calendar.getInstance(); calendar.setTime(stock.getDate()); System.out.println(calendar.getYear()); 

像这样,您仍然可以在Stock类中存储Date ,当仅从数据存储中存储和检索Stock对象时,该类应该具有最佳性能。 如果您一次执行多个操作,也可以重用相同的Calendar对象。

如果您不喜欢Calendar接口,您仍然可以使用Joda Time来执行时间操作。 如果需要,您可以将日期转换为Joda Time,以及进行时间操作,并且仍然将Date对象存储在Stock类中。

如果要用org.joda.time.DateTime替换的java.util.Calendar实例被解析和/或格式化为特定模式 ,例如

 String format = "YYYY-MM-dd HH:mm:ss"; 
  1. 在参数和返回类型的方法签名中,以及变量声明

和实例化,重新调整类名称Calendar 整个单词出现次数

DateTime )和SimpleDateFormat (使用DateTimeFormatter

  1. 替换格式化程序实例化语句,例如

     formatter = new SimpleDateFormat(format); 

     formatter = DateTimeFormat.forPattern(format); 
  2. 将调用替换为`SimpleDateFormat’的方法,例如

     String dateStr = formatter.format(Calendar.getInstance().getTime()); 

     String dateStr = DateTime.now().toString(formatter); 

     formatter.parse(dateStr); 

     DateTime.parse(dateStr, formatter); 

我过去使用过Joda,它是一个很棒的库。

在性能方面,不幸的是你必须测试它。 但重构你的代码似乎太多了。 就个人而言,我在整个应用程序中使用了Date (包括DB存储和检索),并且仅在我需要数据操作时才使用Joda。 Joda只在需要时计算字段,所以我猜测开销会比使用Java API类低得多; 此外,您不会有对象版本问题来传输和处理数据库中的Date对象,序列化对象等。 我不认为Joda会破坏这种兼容性,但使用Date可能性较小。

总的来说,移动到joda-time总是更好。 但是,根据您与日期使用相关的使用情况,您的项目移动到joda-time是非常值得的。 查看演示文稿中的幻灯片编号46,了解某些操作链接文本的性能相关数字