假设一个应用程序每秒使用一些已知SimpleDateFormat
模式解析数千个日期字符串。应用程序需要动态地决定每个这样的日期模式是否有一个时区,即日期模式字符串是否在其中的任何位置包含不带引号的字母Z
or X
,无论是大写还是小写(即总共 4 个符号)。
此类日期模式的示例如下:
- yyyy/MM/dd HH:mm:ss.SSS Z // 时区(未引用
Z
符号) - yyyy/MM/dd HH:mm:ss.SSS'Z' // 无时区(引用
Z
符号) - EEE MMM dd HH:mm:ss x yyyy // 时区(未引用
x
符号) - EEE MMM dd HH:mm:ss'x'yyyy // 无时区(引用
x
符号)
一种方法是使用类的indexOf()
方法String
,但这意味着在每个日期模式上运行该方法 4 次(如果日期模式字符串预先转换为大写或小写,则运行 2 次),并检查时区是否引用符号(在这种情况下,模式实际上没有时区)。
另一种选择是使用 java 正则表达式,例如
String date = ... // Get a SimpleDateFormat pattern
Pattern timezone = Pattern.compile("[^ZzXx]+[^'\"][ZzXx]{1}.*");
if (timezone.matcher(date).matches())
{
// The date pattern does have a timezone
}
上述正则表达式是否有更快的版本,即对于
"[^ZzXx]+[^'\"][ZzXx]{1}.*"
或任何其他更快的方法,一般来说,检查SimpleDateFormat
模式是否包含时区符号?