【问题标题】:What is the simplest correct way to get 'previous day at 15:00' in joda time在joda时间获得“前一天15:00”的最简单正确方法是什么
【发布时间】:2014-09-24 08:47:29
【问题描述】:

假设我有一个 DateTime 参考,我想在 15:00 获取前一天的时间。 如果我说

DateTime someTime = ....;
DateTime yesterday1500 = someTime.toDateMidnight().toDateTime().minusDays(1).plusHours(15);

那么这将在所有日子都有效,除非有夏令时更改。
如果 someTime = '1.4.2014' 我会得到 '31.3.2014 15:00'。
如果 someTime = '31.3.2014' 我会得到 '30.3.2014 16:00'。

我能想到的最好的就是

yesterday1500 = new DateTime(someTime.getYear(), someTime.getMonthOfYear(), someTime.getDayOfMonth(), 15, 0, 0, 0);

它工作正常,但看起来很笨重。 有没有更好的办法?

编辑: 我在 CEST (UTC+01:00) 时区的克罗地亚。

编辑 2: 在示例代码中添加了 ...toDateMidnight().toDateTime()... 以指示 someTime 可以在任何时间点

【问题讨论】:

    标签: java datetime time jodatime


    【解决方案1】:

    这很整洁:

    DateTime dt = someTime.minusDays(1).withTime(15, 0, 0, 0);
    

    【讨论】:

    • 正是我想要的。谢谢。
    【解决方案2】:

    @dcarapic,我尝试了几个版本的 Joda,没有发现你的问题。

    只需使用您的代码,例如:

    日期时间昨天1500 = someTime.minusDays(1).plusHours(15);

    输出如下,我也查了two comings time saving moment,你的情况也没有。

    2014-01-04T00:00:00.000+08:00 | 2014-01-03T15:00:00.000+08:00

    2014-03-31T00:00:00.000+08:00 | 2014-03-30T15:00:00.000+08:00

    2014-09-26T00:00:00.000+08:00 | 2014-09-25T15:00:00.000+08:00

    2014-09-28T00:00:00.000+08:00 | 2014-09-27T15:00:00.000+08:00

    顺便说一下,withTime 和 plusHour 都调用了 withMillis 来设置新的小时。我看不出有什么区别。我已经检查了 joda 2.4/1.6。那么,你用的是什么版本呢?

    【讨论】:

    • -1 代码无法正常工作。删除一天并增加 15 小时不会导致前一天的下午 3 点。
    • 我使用的是 Joda time 1.5.2。注意:我不允许更新到较新的版本。我可以用我的时区 (+01:00) 重现问题。可能是夏令时在您所在时区的不同时间发生变化。在我的时区,它在 02:00 发生变化。
    • darapic,好吧,那是有道理的。我稍后会检查它。我在中国,我们根本不使用节省时间。您的案例不会出现在我的代码上。那是事实。而且,就是这样。 @Duncan,放轻松。
    • @kthinker “放轻松”是什么意思?您的代码错误 - 您在发布时是否出错?也许你忘记了toDateMidnight()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2022-01-24
    • 2019-04-21
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多