如何将Java生成的日期转换为带T和Z的UTC标准格式?
日期格式生成与T字符解释
关于格式中的"T"和"Z"
- T:是ISO 8601标准日期时间格式里的固定分隔符,用来明确区分日期段(
2023-01-16)和时间段(23:59:59.938)。 - Z:代表UTC时区(零时区),等价于
+00:00,表示该时间基于国际标准时间,而非本地时区。
生成目标格式日期的实现
推荐使用Java 8及之后引入的java.time包下的日期时间API(替代老旧的Date/Calendar,API设计更合理,避免线程安全问题):
示例代码(Java 8+)
import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; public class DateExample { public static void main(String[] args) { // 1. 获取当前时间,减去1年 LocalDateTime now = LocalDateTime.now(); LocalDateTime oneYearAgo = now.minus(1, ChronoUnit.YEARS); // 2. 调整到目标时间:23:59:59.938(可按需修改日期、时间参数) LocalDateTime targetDateTime = oneYearAgo .withDayOfMonth(16) .withHour(23) .withMinute(59) .withSecond(59) .withNano(938_000_000); // 938毫秒转纳秒 // 3. 转换为UTC时区并格式化为目标格式 String frmDt = targetDateTime.atOffset(ZoneOffset.UTC) .format(DateTimeFormatter.ISO_INSTANT); System.out.println("FrmDt: \"" + frmDt + "\""); } }
兼容旧版Java(Java 7及以下)
若需兼容旧版本,可使用SimpleDateFormat(注意:该类非线程安全,多线程场景需谨慎):
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; public class OldDateExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // 减去1年 cal.add(Calendar.YEAR, -1); // 调整日期、时间参数 cal.set(Calendar.DAY_OF_MONTH, 16); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); cal.set(Calendar.MILLISECOND, 938); // 指定UTC时区并格式化 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); String frmDt = sdf.format(cal.getTime()); System.out.println("FrmDt: \"" + frmDt + "\""); } }
内容的提问来源于stack exchange,提问作者Albert Lam
相关产品推荐
相关产品推荐

