使用joda的Java时间日期

时间:2015-10-24 18:05:47

标签: java datetime jodatime

这是我用joda时间计算参考时间的代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.joda.time.Interval;
import org.joda.time.Period;

public class DateDiff {

    public static void main(String[] args) {

    DateDiff obj = new DateDiff();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-DD hh:mm:ss");

    try {

        Date date1 = simpleDateFormat.parse("2015-10-01 20:32:06");
        Date date2 = simpleDateFormat.parse("2015-10-25 00:52:36");

        obj.printDifference(date1, date2);  

        } catch (ParseException e) {
        }
    }

    public void printDifference(Date startDate, Date endDate){

        Interval interval = new Interval(startDate.getTime(), endDate.getTime());
        Period period = interval.toPeriod();

        System.out.printf(
            "%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", 
            period.getYears(), period.getMonths(), period.getDays(),
            period.getHours(), period.getMinutes(), period.getSeconds());
    }
}

以下是我的参考:http://www.mkyong.com/java/java-time-elapsed-in-days-hours-minutes-seconds/ 当我运行我收到的代码时:

  

0年,0个月,2天,4小时,20分钟,30秒

有人可以告诉我我的代码有什么问题吗?

3 个答案:

答案 0 :(得分:1)

  

我已将“DD”更改为“dd'但结果仍然相同

嗯,这是因为您忽略了Period个实例的某些内容:the weeks

您需要输出如下所示的实例:

System.out.printf(
    "%d years, %d months, %d weeks, %d days, %d hours, %d minutes, %d seconds%n",
    period.getYears(), period.getMonths(), period.getWeeks(), period.getDays(),
    period.getHours(), period.getMinutes(), period.getSeconds());

你会得到:

  

0年,0个月,3周,2天,4小时,20分钟,30秒

据我所见......它看起来是正确的。

如果您不想在这里使用这几周,那么您可以使用其他PeriodType。例如:

Period period = interval.toPeriod(PeriodType.yearMonthDayTime());

这会创建一个只使用年,月,日和时间的类型,就像你想要的那样。

然后输出:

  

0年,0个月,23天,4小时,20分钟,30秒

答案 1 :(得分:1)

你工作太多,无法混合两个库的代码:

  • java.util.DateSimpleDateFormat
  • 的旧世界
  • 约达时间

更好的解决方案是仅使用一个库,这里是Joda-Time的代码(因为旧世界根本不处理持续时间):

DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt1 = LocalDateTime.parse("2015-10-01 20:32:06", f);
LocalDateTime ldt2 = LocalDateTime.parse("2015-10-25 00:52:07", f);
Period p = new Period(ldt1, ldt2, PeriodType.yearMonthDayTime());
String diff = PeriodFormat.wordBased(Locale.ENGLISH).print(p);
System.out.println(diff); // 23 days, 4 hours, 20 minutes and 1 second

与建议的混合解决方案相比的优势:

  • 更短的
  • 零组件被抑制
  • 处理多元化(英语:" 1秒" vs." 2秒")
  • 列出模式支持,包括单词"和"

关于格式模式的一般建议:

请始终参考图书馆的documentation,使用了您可以使用的格式符号及其含义。阅读比猜测更好;-)。所有图书馆都没有独特的模式,但是" D"真的代表着&#3​​4;每年的日子"和" d"为"日期"在两个图书馆。

答案 2 :(得分:0)

d天很小。

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");


D   Day in year
d   Day in month

SimpleDateFormat doc