Java中CST转UTC时如何保持原日期范围不变的技术求助
问题分析
你当前的代码逻辑是将CST时区的指定日期时间转换为UTC时区的时间,这就导致了时区偏移带来的日期变化:比如CST(UTC-5)的2021-08-26 23:59:59转换为UTC后是2021-08-27 04:59:59Z,因为UTC比CST早5小时。
而你的需求是将输入的日期字符串直接映射为UTC时区的对应自然日起止时间,也就是忽略输入时区的偏移,把20210825当作UTC的2021年8月25日,直接输出该日期的00:00和23:59的UTC格式。
解决方案
要实现这个需求,我们需要调整日期解析的时区设置:不再使用输入的inputTimezoneId来解析日期字符串,而是直接用UTC时区解析拼接后的日期时间字符串,然后输出UTC格式的结果。
修改后的代码如下:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.TimeZone; public class CalendarFormat { public static final String STARTTIME = " 00:00:00"; public static final String ENDTIME = " 23:59:59"; public static final String TIME_ZONE_UTC = "UTC"; public static final String INPUT_DATE_FORMAT = "yyyyMMdd HH:mm:ss"; public static final String ISO_8601_FORMAT_MILLISECOND = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; public static void main(String[] args) { String[] result = CalendarFormat.getDateFormat("20210825_20210826", "CST"); System.out.println("From: " + result[0]); System.out.println("To: " + result[1]); // 输出结果会是: // From: 2021-08-25T00:00:00.000Z // To: 2021-08-26T23:59:59.000Z } public static String mySqlDateFormatInUtc(String date, String time) { final TimeZone utcTimeZone = TimeZone.getTimeZone(CalendarFormat.TIME_ZONE_UTC); SimpleDateFormat input = new SimpleDateFormat(INPUT_DATE_FORMAT); // 关键修改:用UTC时区解析输入的日期时间字符串 input.setTimeZone(utcTimeZone); String dateToBeformatted = date + " " + time; SimpleDateFormat output = new SimpleDateFormat(CalendarFormat.ISO_8601_FORMAT_MILLISECOND); output.setTimeZone(utcTimeZone); String format = null; try { format = output.format(input.parse(dateToBeformatted)); } catch (ParseException e) { e.printStackTrace(); } return format; } public static String[] getDateFormat(String dateRangeString, String inputTimezoneId) { String[] dates = dateRangeString.split("_"); // 注意:这里不再传入inputTimezoneId给mySqlDateFormatInUtc,因为我们直接按UTC解析日期 String from = CalendarFormat.mySqlDateFormatInUtc(dates[0], CalendarFormat.STARTTIME); String to = CalendarFormat.mySqlDateFormatInUtc(dates[1], CalendarFormat.ENDTIME); dates[0] = from; dates[1] = to; return dates; } }
关键修改点
- 移除了
mySqlDateFormatInUtc方法中的inputTimezoneId参数,因为我们不再需要用输入时区解析日期 - 将
input的时区设置为UTC,这样拼接后的date + time会被当作UTC时间来解析 - 输出的时区保持UTC,确保结果是标准的ISO-8601 UTC格式
补充说明
如果你之后需要处理输入时区的自然日转换为UTC时区的对应时间段(而不是强制相同日历日期),那原代码的逻辑是正确的,但你需要接受时区偏移带来的日期跨天情况。比如CST(UTC-5)的2021-08-25自然日对应的UTC时间段是2021-08-25T05:00:00.000Z到2021-08-26T04:59:59.000Z,这是符合时区转换逻辑的。
但根据你的需求,上述修改后的代码可以完美实现你期望的输出结果。
内容的提问来源于stack exchange,提问作者yogesh
相关产品推荐
相关产品推荐

