Java中支持ZoneId的时间戳正则表达式修改需求
支持ZoneId的文件名时间戳解析方案
一、修改后的正则表达式
新正则需兼容三种文件名格式:
[TimeStamp](无格式无时区)[TimeStamp:yyyyMMdd_HHmm](仅格式无时区)[TimeStamp|Asia\Tokyo:yyyyMMdd_HHmm](带时区和格式)
对应的正则表达式:
\[TimeStamp(\|([^\[:\]]+))?(:[^\[\]]+)?\]
正则规则说明
\[TimeStamp:匹配固定开头的[TimeStamp(\|([^\[:\]]+))?:可选的时区捕获段,用|作为时区分隔符,[^\[:\]]+确保只捕获合法的ZoneId字符(排除[、:、])(:[^\[\]]+)?:保留原有的格式捕获逻辑,可选匹配格式字符串\]:匹配结尾的]
二、调整后的Java代码
引入时区相关API,兼容原有逻辑的同时支持根据指定ZoneId生成对应时间:
import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FileNameTimestampProcessor { private static final String DEFAULT_FORMAT = "yyyyMMddHHmmss"; private static final String TIMESTAMP_REGEX = "\\[TimeStamp(\\|([^\\[:\\]]+))?(:[^\\[\\]]+)?\\]"; public static String processFileName(String fileNamePattern) { // 默认使用系统时区 ZoneId defaultZone = ZoneId.systemDefault(); ZonedDateTime targetDateTime = ZonedDateTime.now(defaultZone); Matcher matcher = Pattern.compile(TIMESTAMP_REGEX, Pattern.DOTALL).matcher(fileNamePattern); StringBuffer resultBuffer = new StringBuffer(); while (matcher.find()) { // 处理时区解析 if (matcher.group(2) != null) { // 把转义斜杠替换为标准格式,适配Asia\Tokyo这类输入 String zoneIdStr = matcher.group(2).replace("\\", "/"); ZoneId targetZone = ZoneId.of(zoneIdStr); targetDateTime = ZonedDateTime.now(targetZone); } // 处理时间格式解析 DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DEFAULT_FORMAT); if (matcher.group(3) != null) { String formatStr = matcher.group(3).replaceFirst(":", ""); dtf = DateTimeFormatter.ofPattern(formatStr); } // 替换匹配段,避免多次replace的性能问题 matcher.appendReplacement(resultBuffer, dtf.format(targetDateTime)); } matcher.appendTail(resultBuffer); return resultBuffer.toString(); } public static void main(String[] args) { // 测试三种场景 System.out.println(processFileName("File_[TimeStamp].csv")); System.out.println(processFileName("File_[TimeStamp:yyyyMMdd_HHmm].csv")); System.out.println(processFileName("File_[TimeStamp|Asia\\Tokyo:yyyyMMdd_HHmm].csv")); } }
代码调整要点
- 时区处理:新增ZoneId解析逻辑,将输入中的转义斜杠转换为标准时区格式,获取对应时区的当前时间
- 替换逻辑优化:使用
StringBuffer配合appendReplacement/appendTail,提升字符串替换效率并兼容特殊字符 - 向下兼容:保留原有的默认格式、无时区无格式场景,确保原有功能不受影响
三、测试输出示例
运行后输出类似(假设系统时区为东八区):
File_20240520143512.csv File_20240520_1435.csv File_20240520_2135.csv // 东京时区比东八区快1小时
内容的提问来源于stack exchange,提问作者Biswajit
相关产品推荐
相关产品推荐

