Я думаю, что большую часть времени вы захотите, чтобы joda исправила это автоматически.Часто вы не знаете, как правильно установить дату разрыва, потому что размер разрыва зависит от зоны и года (хотя, конечно, обычно это час).
Один из примеров - если выпарсинг метки времени из источника, который вы не контролируете;например, сеть.Если отправитель временной метки имеет устаревшие файлы зон, это может произойти.(Если у вас есть устаревшие файлы зон, вы в значительной степени облажались).
Вот способ сделать это, что, конечно, немного сложнее.Я сделал так, чтобы это работало в joda 1.6, а также в 2.x, так как в нашей среде мы застряли на 1.6.
Если вы строите дату из других входных данных, как в вашем вопросе,Вы можете начать с даты UTC или LocalDate
, как предложено выше, а затем адаптировать ее для автоматического исправления смещения.Специальный соус находится в DateTimeZone.convertLocalToUTC
Опасно:
public DateTime parse(String str) {
formatter.parseDateTime(gapdate)
}
Безопасно:
public DateTime parse(String str) {
// separate date from zone; you may need to adjust the pattern,
// depending on what input formats you support
String[] parts = str.split("(?=[-+])");
String datepart = parts[0];
DateTimeZone zone = (parts.length == 2) ?
DateTimeZone.forID(parts[1]) : formatter.getZone();
// parsing in utc is safe, there are no gaps
// parsing a LocalDate would also be appropriate,
// but joda 1.6 doesn't support that
DateTime utc = formatter.withZone(DateTimeZone.UTC).parseDateTime(datepart);
// false means don't be strict, joda will nudge the result forward by the
// size of the gap. The method is somewhat confusingly named, we're
// actually going from UTC to local
long millis = zone.convertLocalToUTC(utc.getMillis(), false);
return new DateTime(millis, zone);
}
Я проверял это в восточном и западном полушариях, а такжезона острова Лорда Хау, которая имеет полчаса dst.
Было бы неплохо, если бы форматировщики joda поддерживали setStrict (булево), которое заставило бы их позаботиться об этом за вас ...