找到java中两个(Joda Time)DateTime对象之间的确切差异

Zac*_*ach 5 java date jodatime difference

我有两个日期(其中一个是现在),需要找到两者之间的差异.我的代码给了我糟糕的输出(有时甚至是负面的).

我已经尝试过使用Months,Days,Seconds,Hours和Years类,并且在没有运气的方法之间使用.

编辑:返回原始代码,但没有持续时间.@Basil Bourque发布了一个很好的解决方案,但我对Periods/Duration以及从它们动态格式化的所有方面都没有足够的经验.

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;
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 5

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

Period

在Joda-Time中,Period当您想要将时间跨度表示为年,月,日,小时,分钟,秒时,请使用该类.乔达-时间表示任何的三种方式跨度:Interval,Duration,或Period.

Joda-Time遵循ISO 8601标准,用于解析和生成日期时间值的字符串表示.对于Period,表示在将年 - 月 - 日部分与小时 - 分 - 秒部分分开时标记开头的PnYnMnDTnHnMnS格式.半小时是.代表"三年,六个月,四天,十二小时,三十五分五秒".搜索StackOverflow.com以获取更多信息和示例.PTPT30MP3Y6M4DT12H30M5S

如果你想用文字漂亮打印,请查看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 ) ;
Run Code Online (Sandbox Code Playgroud)