Скажем, у меня есть ссылка 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).
Edit 2: Добавлено... toDateMidnight(). ToDateTime()... в пример кода, чтобы указать, что someTime может быть в любой момент времени
Это довольно аккуратно:
DateTime dt = someTime.minusDays(1).withTime(15, 0, 0, 0);
@dcarapic, я пробовал несколько версий Joda, не нашел вашей проблемы.
Просто используйте свой код, например:
DateTime вчера1500 = someTime.minusDays(1).plusHours(15);
Результат похож на нижеследующий, я также проверил два момента экономии времени, ваш случай также не возникает.
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. Итак, какую версию вы используете?