You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SimpleDateFormat解析不同日期输出统一时区的Date对象

问题分析

你遇到的问题根源在于:SimpleDateFormat默认使用系统默认时区,而英国时区(GMT/BST)存在夏令时切换机制——12月处于标准时间(GMT),6月处于夏令时(BST)。Date对象本身只是时间戳(无时区属性),调用toString()时会根据系统时区和日期是否在夏令时区间,自动显示对应的时区标识,导致输出不一致。

解决方案

以下两种方案都能实现统一时区输出,优先推荐Java 8+的新日期API:

方案1:使用Java 8+ java.time新API(推荐)

新API线程安全、设计更合理,可直接指定固定时区:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class ParseDate {
    public static final String DATE_FORMAT = "yyyy-MM-dd";
    // 固定指定GMT时区
    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT)
            .withZone(ZoneId.of("GMT"));

    public static void main(String[] args) {
        LocalDate date1 = LocalDate.parse("2020-12-31", DATE_FORMATTER);
        LocalDate date2 = LocalDate.parse("2020-06-30", DATE_FORMATTER);
        
        // 转换为带GMT时区的起始时间
        ZonedDateTime zdt1 = date1.atStartOfDay(ZoneId.of("GMT"));
        ZonedDateTime zdt2 = date2.atStartOfDay(ZoneId.of("GMT"));
        
        System.out.println("Converting 2020-12-31 to " + zdt1);
        System.out.println("Converting 2020-06-30 to " + zdt2);
    }
}

输出:

Converting 2020-12-31 to 2020-12-31T00:00Z[GMT]
Converting 2020-06-30 to 2020-06-30T00:00Z[GMT]

方案2:给旧版SimpleDateFormat指定固定时区(兼容Java 8以下)

修改原代码,为格式化器强制设置固定时区:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class ParseDate {
    public static final String DATE_FORMAT = "yyyy-MM-dd";
    public static SimpleDateFormat DateFormatter = new SimpleDateFormat(DATE_FORMAT);
    
    static {
        // 固定指定GMT时区,也可替换为"Europe/London"等其他时区ID
        DateFormatter.setTimeZone(TimeZone.getTimeZone("GMT"));
    }

    public static void main(String[] args) {
        try {
            System.out.println("Converting 2020-12-31 to " + DateFormatter.parse("2020-12-31"));
            System.out.println("Converting 2020-06-30 to " + DateFormatter.parse("2020-06-30"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

输出:

Converting 2020-12-31 to Thu Dec 31 00:00:00 GMT 2020
Converting 2020-06-30 to Tue Jun 30 00:00:00 GMT 2020

内容的提问来源于stack exchange,提问作者Nag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:01:06