【发布时间】:2016-02-15 12:28:31
【问题描述】:
我正在尝试编写一个类,它能够将多格式和多语言环境的字符串解析为DateTime。
multi-format 表示日期可能是:dd/MM/yyyy、MMM dd yyyy、...(最多 10 种格式)
multi-locale 表示日期可能是:29 Dec 2015、29 Dez 2015、dice 29 2015 ...(最多 10 个语言环境,例如 en、gr、it、jp)
使用答案Using Joda Date & Time API to parse multiple formats我写道:
val locales = List(
Locale.ENGLISH,
Locale.GERMAN,
...
)
val patterns = List(
"yyyy/MM/dd",
"yyyy-MM-dd",
"MMMM dd, yyyy",
"dd MMMM yyyy",
"dd MMM yyyy"
)
val parsers = patterns.flatMap(patt => locales.map(locale => DateTimeFormat.forPattern(patt).withLocale(locale).getParser)).toArray
val birthDateFormatter = new DateTimeFormatterBuilder().append(null, parsers).toFormatter
但它不起作用:
birthDateFormatter.parseDateTime("29 Dec 2015") // ok
birthDateFormatter.parseDateTime("29 Dez 2015") // exception below
Invalid format: "29 Dez 2015" is malformed at "Dez 2015"
java.lang.IllegalArgumentException: Invalid format: "29 Dez 2015" is
malformed at "Dez 2015"
我发现所有parsers: List[DateTimeParser] 在追加到birthDateFormatter: DateTimeFormatter 后“丢失”了他们的语言环境。而birthDateFormatter 只有一种语言环境——en。
我会写:
val birthDateFormatter = locales.map(new DateTimeFormatterBuilder().append(null, parsers).toFormatter.withLocale(_))
并像这样使用它:
birthDateFormatter.map(_.parseDateTime(stringDate))
但它会抛出很多异常。太可怕了。
如何使用 joda-time 解析多格式和多语言环境的字符串? 我该怎么做?
【问题讨论】:
-
这启发了我实施my own multi-format parser。虽然它不是 Joda-Time,但它可以处理多种格式和语言环境,甚至不会在内部抛出和捕获异常。也许您可以研究源代码,JUnit-test-case 并尝试从中学习。但是,我假设实现不能转移到 Joda-Time 1:1。也许你找到了这样做的方法。另请参阅我的图书馆的tutorial page。
-
@MenoHochschild,这是一个很好的解决方案!稍后我将尝试 Time4J。我认为,您应该在主题中添加答案。该解决方案可能对某人有所帮助。
-
好吧,我将等待答案,直到我设法发布下一个版本的 Time4J (v3.14/v4.11),其中将包含提到的和已经实现的
MultiFormatParser。我希望下周末。我也会尝试找一些时间来更详细地研究性能。 -
抱歉,回答迟了(见下文),但我想提供 Joda-Time 的替代品,前提是它真的更快并且可以帮助您解决性能问题。