具有实例本地默认时区的 Joda-time 解析器

Joda-time parser with instance-local default timezone

是否有 Joda 的 DateTimeZone.setDefault 的 "instance-local" 版本?我正在努力实现这样的目标:

val parser = new ParserWithDefaultTimezone("GMT+1");
parser.parse("1970-01-01 00:00:00").getMillis // -3600000L
parser.parse("1970-01-01 00:00:00 UTC").getMillis // 0L

不污染全球任何东西。我在 Joda 文档中只能找到(具有讽刺意味的)修改全局状态的内容。

如果有非 Joda 解决方案,我也很感兴趣。

编辑:忘记提及,如果没有现成的 class 可以做到这一点,我将满足于:"what is the easiest way to see if a time string contains an explicit timezone?" 我无法区分明确的和Joda 默认设置的时区。

编辑 2:我没有要输入的格式字符串;我正在寻找可以在运行时推断格式的东西。

您可以使用 withZone 更改使用的 date/time 区域:

val fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss ZZZ").withZone(DateTimeZone.forID("Europe/Berlin"))
val date = fmt.parseDateTime(???);

使时区可选的设置有点复杂:

val tz = new DateTimeFormatterBuilder().appendLiteral(" ").appendTimeZoneId().toFormatter()
val fmt = new DateTimeFormatterBuilder()
            .append(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"))
            .appendOptional(tz.getParser())
            .toFormatter().withZone(DateTimeZone.forID("Europe/Berlin"))

println(fmt.parseDateTime("1970-01-01 12:00:00 UTC"))
println(fmt.parseDateTime("1970-01-01 12:00:00 Europe/Berlin"))
println(fmt.parseDateTime("1970-01-01 12:00:00"))

只要你的备注

I don't have a format string to feed; I'm looking for something that infers the format at runtime.

仅适用于时区,解决方案 2 可能会满足您的要求。另一方面,如果您真的不知道以何种格式提供日期(dd/mm/yyyy vs. mm/dd/yyyy vs. yyyy/mm/dd vs. 其他),那么我认为您运气不好:这样的转换充其量是模棱两可的。 01/03/2015 是 3 月 1 日还是 1 月 3 日?