如何在Java中生成与JavaScript Date对象完全一致的日期输出
Java实现JavaScript Date默认输出格式方案
格式匹配规则
JavaScript执行new Date()的默认字符串输出遵循固定格式:
- 周几:3位英文缩写
- 月份:3位英文缩写
- 日期:两位数字,不足补前导0
- 年份:四位数字
- 时间:24小时制,时分秒各两位,冒号分隔
- 时区标识:固定前缀
GMT,后跟正负号+四位偏移量 - 时区名称:括号包裹的时区全称,自动适配夏令时/冬令时命名
最简实现(无第三方依赖)
兼容所有Java版本(使用SimpleDateFormat)
直接复用JDK自带的日期格式化类即可,注意指定英文Locale避免本地化输出偏差:
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class DateDemo { // 全局复用格式化实例,多线程场景建议用ThreadLocal包装 private static final SimpleDateFormat JS_DATE_FORMAT = new SimpleDateFormat( "EEE MMM dd yyyy HH:mm:ss 'GMT'Z (zzzz)", Locale.ENGLISH ); public static void main(String[] args) { // 输出效果和JS完全一致 System.out.println(JS_DATE_FORMAT.format(new Date())); } }
运行输出示例:
Sat Jul 02 2022 22:49:06 GMT-0800 (Alaska Daylight Time)
Java 8+ 推荐实现(线程安全)
Java 8及以上版本推荐用java.time包的线程安全API,无需考虑多线程并发问题:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class DateDemo { private static final DateTimeFormatter JS_DATE_FORMATTER = DateTimeFormatter.ofPattern( "EEE MMM dd yyyy HH:mm:ss 'GMT'xx (zzzz)", Locale.ENGLISH ); public static void main(String[] args) { System.out.println(JS_DATE_FORMATTER.format(ZonedDateTime.now())); } }
关键注意点
- 必须传入
Locale.ENGLISH参数,否则非英文系统会输出本地化的周、月、时区名称,和JS输出不匹配 - 模式串中
GMT需要用单引号包裹,标记为固定字符串,避免被格式化器解析为占位符 - 格式化逻辑会自动识别当前系统时区的夏令时状态,输出对应时区全称,和JS的时区显示逻辑完全对齐
内容的提问来源于stack exchange,提问作者lol
相关产品推荐
相关产品推荐

