Я думаю, что в большинстве случаев вы захотите, чтобы 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);
}
Я проверял это в восточном и западном полушариях, а также в зоне острова Лорд-Хау, где время летнего времени получасовое.
Было бы неплохо, если бы форматировщики joda поддерживали setStrict (boolean), чтобы они позаботились об этом для вас...
person
Jeremy Huiskamp
schedule
12.07.2013