在java中查找两个(Joda Time)DateTime对象之间的确切区别

我给了两个日期(其中之一是现在),并且需要找出两者之间的区别。 我的代码给了我不好的输出(有时甚至是负面的)。

我尝试过使用“月”,“日”,“秒”,“小时”和“年”类,并且在没有运气的方法之间适当使用。

编辑:回到我的原始代码,但没有持续时间。 @Basil Bourque发布了一个很好的解决方案,但我只是没有足够的期限/持续时间经验以及从中动态格式化的所有经验。

public static String formattedTime(DateTime d){
    DateTime present = new DateTime(Calendar.getInstance());

    //dont really want to deal with WHY its 7hrs ahead. o well
    DateTime date = d.minusHours(7);

    int diff = Seconds.secondsBetween(date,present).getSeconds();
    String postfix = "s";
    Log.i("time", "" + diff);

    if(diff>59){
        diff = Minutes.minutesBetween(date, present).getMinutes();
        postfix = "s";
        if(diff>59){
            diff = Hours.hoursBetween(date, present).getHours();
            postfix = "hr";
            if(diff>1)
                postfix+="s";
            if(diff>23){
                diff = Days.daysBetween(date, present).getDays();
                postfix = "d";
                if(diff>6){
                    diff = Weeks.weeksBetween(date, present).getWeeks();
                    postfix = "wk";
                    if(diff>1)
                        postfix+="s";
                    if(diff>3){
                        diff = Months.monthsBetween(date, present).getMonths();
                        postfix = "m";
                        if(diff>11){
                            diff = Years.yearsBetween(date, present).getYears();
                            postfix = "yr";
                            if(diff>1)
                                postfix+="s";
                        }
                    }
                }
            }
        }
    }
    return diff+postfix;
}

你工作太辛苦了。 你正在使用错误的类来达到你的目的。

Period

在Joda-Time中,如果要将时间跨度表示为年,月,日,小时,分钟和秒数,请使用Period类。 Joda-Time以三种方式中的任何一种表示时间跨度: IntervalDurationPeriod

Joda-Time遵循ISO 8601标准来解析和生成日期 - 时间值的字符串表示。 对于Period来说,这意味着PnYnMnDTnHnMnS格式,其中P标记开头,而T将年 - 月 - 日部分与小时 - 分钟部分分开。 半小时是PT30MP3Y6M4DT12H30M5S代表“三年,六个月,四天,十二小时,三十分钟和五秒”。 搜索StackOverflow.com以获取更多信息和示例。

如果您想用单词进行漂亮打印,请查看PeriodFormatterPeriodFormatterBuilder类。

如果您需要整数,您还可以向Period对象请求各种组件编号。

时区

另外,你应该指定一个时区。 如果省略,则隐式应用JVM的当前默认时区。 最好明确指定你期望/期望的时区。

始终使用适当的时区名称,而不是3-4字母代码。 这些代码既不标准也不唯一。 他们进一步混淆了夏令时(DST)的问题。

此外,通常服务器保持在UTC时区。 通常最好做几乎所有的业务逻辑,数据存储,数据交换以及以UTC格式记录。

示例代码

请注意,您可以在当前时刻询问DateTime而不涉及java.util.Date对象(如您的问题所示)。

Period的示例代码。

DateTimeZone zone = DateTimeZone.forID( "America/Detroit" ) ;
DateTime then = new DateTime( yourJUDate , zone ) ;
DateTime now = DateTime.now( zone ) ;
Period period = new Period( then , now ) ;

你可以在这里看到答案:两个日期之间的天数,并用你想要的单位进行调整。


使两个字符串相互比较,您可以使用String#split()方法分割它以查明年/月/日等。

链接地址: http://www.djcxy.com/p/36667.html

上一篇: Find the exact difference between two (Joda Time) DateTime objects in java

下一篇: > easier way?