具有实例本地默认时区的 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 日?
是否有 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 日?