繁体   English   中英

Java正则表达式以SimpleDateFormat模式检测时区

[英]Java regular expression to detect timezone in SimpleDateFormat pattern

假设一个应用程序使用一些已知的SimpleDateFormat模式每秒解析数千个日期字符串。 应用程序需要动态地决定每个这样的日期模式是否都具有时区,即日期模式字符串是否在其中的任何位置且不带引号的大写或小写字母(即,总共4个符号)都包含字母ZX

这样的日期模式的示例是:

  • 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符号)

一种方法是使用String类的indexOf()方法,但这意味着在每个日期模式上运行该方法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模式是否包含时区符号?

我建议这样做尽可能简单:

String string = "...";

Pattern p = Pattern.compile("\\b(?<!')([xXzZ])(?!')\\b");
Matcher m = p.matcher(string);
if (m.find()) {
  String timeZone = m.group(1);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM