我有一位用户将其时区配置为America/New_York
。我必须安排一个他应该在午夜开始并在24小时后(下一个午夜)结束的活动。但我想将日期存储在UTC
的数据库中。
所以我使用Joda DateTime编写了以下代码段。
DateTime dateTime = new DateTime(DateTimeZone.forID(user.getTimezone()));
DateTime todayMidnight = dateTime.toDateMidnight().toDateTime();
// now setting the event start and end time
event.setStartTime(todayMidnight.toDate());
event.setEndTime(todayMidnight.plusDays(1).toDate());
请注意,我的服务器正在以UTC时区运行,
America/New_York
是UTC-5,所以我希望startdate为4th Feb 2013 5:0:0
,但对我而言,它的开始日期为3rd Feb 2013 23:0:0
上面的代码有什么问题。?
答案 0 :(得分:1)
我建议你避免完全使用DateMidnight
。 (这对纽约来说可能没问题,但在其他时区,由于夏令时的变化,有几天午夜不存在。)使用LocalDate
来表示日期。
例如:
DateTimeZone zone = DateTimeZone.forID(user.getTimezone());
// Defaults to the current time. I'm not a fan of this - I'd pass in the
// relevant instant explicitly...
DateTime nowInZone = new DateTime(zone);
LocalDate today = nowInZone.toLocalDate();
DateTime startOfToday = today.toDateTimeAtStartOfDay(zone);
DateTime startOfTomorrow = today.plusDays(1).toDateTimeAtStartOfDay(zone);
event.setStartTime(startOfToday.toDate());
event.setEndTime(startOfTomorrow.toDate());