java 字符串时间转化为 long ,日期格式 "yyyy-MM-dd'T'HH:mm:ss.SSS" 和 "yyyy-MM-dd'T'HH:mm:ss.SSSZ"的区别
Java 字符串时间转换为 long:两种日期格式的区别
在 Java 中,将时间字符串转换为 long 类型的时间戳(毫秒数)时,日期格式 "yyyy-MM-dd'T'HH:mm:ss.SSS" 和 "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 有重要区别,主要体现在时区处理上。
两种格式的区别
1. "yyyy-MM-dd'T'HH:mm:ss.SSS"(不带时区)
- 解释:这种格式不包含时区信息
- 特点:
- 解析时会使用解析器当前的默认时区
- 如果字符串中没有时区信息,系统会假设它是本地时区的时间
- 示例:
String dateStr = "2023-05-15T14:30:45.123";
2. "yyyy-MM-dd'T'HH:mm:ss.SSSZ"(带时区)
- 解释:这种格式包含时区信息(Z 表示时区)
- 特点:
- Z 可以表示 UTC 时间(如 "Z" 表示 UTC)
- 也可以表示时区偏移(如 "+0800" 表示东八区)
- 解析时会严格按照字符串中的时区信息处理
- 示例:
String dateStr1 = "2023-05-15T14:30:45.123Z"; // UTC 时间 String dateStr2 = "2023-05-15T14:30:45.123+0800"; // 东八区时间
转换代码示例
import java.text.SimpleDateFormat;
import java.util.TimeZone;
public class DateConversion {
public static void main(String[] args) throws Exception {
// 示例1:不带时区的格式
String dateStrNoTz = "2023-05-15T14:30:45.123";
SimpleDateFormat sdfNoTz = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
long timeNoTz = sdfNoTz.parse(dateStrNoTz).getTime();
System.out.println("不带时区的时间戳: " + timeNoTz);
// 示例2:带UTC时区的格式
String dateStrWithTz = "2023-05-15T14:30:45.123Z";
SimpleDateFormat sdfWithTz = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
long timeWithTz = sdfWithTz.parse(dateStrWithTz).getTime();
System.out.println("带UTC时区的时间戳: " + timeWithTz);
// 示例3:带特定时区的格式
String dateStrWithOffset = "2023-05-15T14:30:45.123+0800";
SimpleDateFormat sdfWithOffset = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
long timeWithOffset = sdfWithOffset.parse(dateStrWithOffset).getTime();
System.out.println("带时区偏移的时间戳: " + timeWithOffset);
// 比较结果
System.out.println("差异说明:");
System.out.println("UTC时间与东八区同一时间点的时间戳差异: " + (timeWithTz - timeWithOffset));
}
}
重要注意事项
-
时区影响:同样的时间字符串,在不同时区下解析会得到不同的时间戳(毫秒数)
- 例如 "2023-05-15T14:30:45.123"(东八区)和 "2023-05-15T14:30:45.123Z"(UTC)表示的是不同的时间点
-
格式符号:
Z在格式字符串中表示时区偏移(如 +0800)X可以处理更灵活的时区表示(如 Z、+08、+0800)
-
Java 8+ 推荐:在 Java 8 及以上版本,推荐使用
java.time包中的类:// Java 8+ 的更好方式 Instant instant = Instant.parse("2023-05-15T14:30:45.123Z"); long epochMilli = instant.toEpochMilli(); -
默认时区:如果不指定时区,结果可能因运行环境的默认时区不同而变化
结论
选择哪种格式取决于你的需求:
- 如果时间字符串不包含时区信息,使用
"yyyy-MM-dd'T'HH:mm:ss.SSS" - 如果时间字符串明确包含时区信息,使用
"yyyy-MM-dd'T'HH:mm:ss.SSSX"(更灵活)或"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
对于需要精确时间计算的场景,始终使用时区信息可以避免很多潜在问题。

浙公网安备 33010602011771号