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

时间:2010-10-28 14:57:50

标签: java jodatime

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

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

然而,我遇到了两个缺点。

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

    的当前源代码

    最近,我发现Joda-Time。我通过创建1,000,000 java.util.Datejava.util.Calendarorg.joda.time.DateTime来执行以下基准测试。在实例化过程中,我发现org.joda.time.DateTime的效果优于java.util.Calendar

    以下是基准alt text结果。

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

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

5 个答案:

答案 0 :(得分:11)

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

您在某个特定应用中的性能实际上是多么肯定?你说Stock会创建“多个实例”......有多少?你有没有介绍过它?在大多数情况下,我不希望它真正发挥显着作用。从您的基准测试图中看,您实际测量的内容并不明显。

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

答案 1 :(得分:2)

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

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

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

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

如果您不喜欢Calendar界面,您仍然可以使用Joda Time来执行时间操作。您可以根据需要将日期转换为Joda Time,也可以转换为时间操作,并且仍然会在Date类中存储Stock个对象。

答案 2 :(得分:2)

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

String format = "YYYY-MM-dd HH:mm:ss";
  1. 在参数和返回类型的方法签名中,以及变量声明
  2. 和实例化,repace 整个单词出现的类名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);
      

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

的性能相关数字