ReadyApi中Groovy时区日期解析与UTC格式转换求助
解决带时区日期字符串转UTC格式的Groovy代码
你的原代码问题在于只截取了日期的前10位,完全丢弃了时间和时区偏移信息,导致时区转换根本没生效。比如原日期是UTC-5的2021-10-22 21:43,转UTC后其实是2021-10-23 02:43,对应的日期应该是23:Oct:2021,但你的代码会输出22:Oct:2021,这显然不对。
直接用Java 8+的java.time新日期API(Groovy完全兼容)来处理,代码更简洁且不容易出错,适合在ReadyApi里使用:
import java.time.OffsetDateTime import java.time.ZoneOffset import java.time.format.DateTimeFormatter import java.util.Locale // 输入的带时区日期字符串 def dateStr = '2021-10-22T21:43:00-05:00' // 目标格式 def targetFormat = 'dd:MMM:yyyy' // 1. 直接解析ISO 8601格式的带偏移日期字符串 OffsetDateTime originalDateTime = OffsetDateTime.parse(dateStr) // 2. 转换为UTC时区的日期时间 OffsetDateTime utcDateTime = originalDateTime.withOffsetSameInstant(ZoneOffset.UTC) // 3. 格式化为目标字符串,指定Locale为英文确保月份缩写是英文 String result = utcDateTime.format(DateTimeFormatter.ofPattern(targetFormat, Locale.ENGLISH)) log.info(result) // 输出:23:Oct:2021
代码说明:
OffsetDateTime.parse():自动识别ISO 8601格式的日期字符串(你的输入正好符合这个标准),不需要手动写格式模板,直接解析出带时区偏移的日期时间。withOffsetSameInstant(ZoneOffset.UTC):把原时间转换为UTC时区的同一时刻,日期会根据时区偏移自动调整。DateTimeFormatter.ofPattern(targetFormat, Locale.ENGLISH):指定英文Locale,避免不同环境下月份缩写变成其他语言(比如中文的"十月")。
如果一定要用旧的Date类(不推荐),也可以这样写,但代码更繁琐:
import java.text.SimpleDateFormat import java.util.TimeZone def dateStr = '2021-10-22T21:43:00-05:00' def targetFormat = 'dd:MMM:yyyy' // 解析原日期的格式模板,包含时区偏移 def inputFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX") // 目标格式,指定UTC时区和英文Locale def outputFormatter = new SimpleDateFormat(targetFormat, Locale.ENGLISH) outputFormatter.setTimeZone(TimeZone.getTimeZone("UTC")) // 解析原字符串为Date,再格式化为UTC的目标字符串 Date originalDate = inputFormatter.parse(dateStr) String result = outputFormatter.format(originalDate) log.info(result) // 同样输出:23:Oct:2021
推荐用第一种java.time的方案,因为旧的Date和SimpleDateFormat线程不安全,而且API设计更混乱,新手更容易出错。
内容的提问来源于stack exchange,提问作者Jakub Vlček
相关产品推荐
相关产品推荐

