【问题标题】:Find the exact difference between two (Joda Time) DateTime objects in java在java中找到两个(Joda Time)DateTime对象之间的确切差异
【发布时间】:2015-10-25 01:31:31
【问题描述】:

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

我尝试过使用 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;
}

【问题讨论】:

  • 我刚刚意识到服务器位于不同的时区。当我考虑到这一点时会很快更新

标签: java date jodatime difference


【解决方案1】:

你工作太辛苦了。你为你的目的使用了错误的类。

Period

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

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

如果您想用文字进行漂亮的打印,请查看 PeriodFormatterPeriodFormatterBuilder 类。

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

时区

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

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

此外,服务器通常保持在UTC 时区。通常最好在 UTC 中完成几乎所有的业务逻辑、数据存储、数据交换和日志记录。

示例代码

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

期间的示例代码。

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

【讨论】:

  • 看起来不错,但不幸的是我不确定如何正确使用格式化程序。我认为您的回答很好,但还应注意,如果相差一天,getSeconds 将返回 0。此外,格式化程序似乎有点受限,必须专门定义一个多年.. 但是如果日期差异不是一年?它需要案例。我最终再次使用 Days/Seconds/Hours 类,发现这是我从服务器检索到的日期错误。
  • @Zach 你真的想在很多秒内完成总跳跃时间吗?查看您的代码,您似乎只要求总秒数来计算其他粒度。 Period 处理其他粒度,因此不需要总秒数。但如果你真的想要总秒数,请致电period.toStandardSeconds()。在一天的时间里,那个方法会给你24*60*60。至于格式化,它非常强大、灵活、方便。阅读文档并在 StackOverflow 中搜索示例。
  • 我想从时间单位频谱的一端开始是有意义的,我选择了秒。不过很高兴知道,我一定会尝试从这里优化它
【解决方案2】:

您可以在这里看到答案:Number of days between two dates 并根据您想要的单位进行调整。

【讨论】:

  • 在我的帖子中我注意到我已经尝试过 Days/Seconds/Hours 等课程
【解决方案3】:

制作两个相互比较的字符串,你可以用String#split()方法将其拆分,找出年/月/日等。

【讨论】:

  • 虽然这似乎是获得我的结果的可靠方法,但我正在寻找更优雅的东西。我读过其他类似我的问题,人们使用相同的代码并取得了正确的结果,所以我一定不能使用 Duration 权利
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2016-04-18
相关资源
最近更新 更多