Java 日期时间格式化和解析示例

格式化输出

java8及以上(Java8+) 主要用DateTimeFormatter,它自带了一些格式(如DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;) , 不过我们可以自己自定义,满足不同需求。

java8以下主要用SimpleDateFormat, 当然java8+也可以用, 但是java8+推荐用DateTimeFormatter

  • DateTimeFormatter

主要格式化参数:

字母含义示例
y年(Year)yyyy → 2023, yy → 23
M月(Month)M → 9, MM → 09, MMM → Sep, MMMM → September
d月中的天数(Day of month)d → 5, dd → 05
H小时(24小时制,0-23)H → 13, HH → 13
h小时(12小时制,1-12)h → 1, hh → 01
a上午/下午(AM/PM)a → AM, a → PM
m分钟(Minute)m → 30, mm → 30
s秒(Second)s → 45, ss → 45
E星期几(Day of week)E → Mon, EEEE → Monday
z时区名称(Time zone name)z → CST, zzzz → China Standard Time
Z时区偏移量(RFC 822)Z → +0800
X时区偏移量(ISO 8601)X → +08, XX → +0800, XXX → +08:00
V时区 ID(Zone ID)V → America/New_York
  • SimpleDateFormat

SimpleDateFormat的格式化参数和DateTimeFormatter 差不多。

  1. 将时间显示为如 2000/01/02 03:44:55 星期一, 01-02 03:44, 2000-01-02 03:44

(1) 平台等于大于Java8 (Java8+) 推荐用DateTimeFormatter

// 时间格式化示例
public class ATest {
    public static void main(String[] args) {

        // 这里模拟一个时间:  2000-01-02 03:44:55
        LocalDateTime dateTime = LocalDateTime.of(2000, 1, 2, 3, 44, 55, 0);

        // 定义格式化器
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss E");
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("MM-dd HH:mm");

        // 格式化输出
        String output1 = dateTime.format(formatter1);
        System.out.println("格式1: " + output1); // 格式1: 2000/01/02 03:44:55 周日

        String output2 = dateTime.format(formatter2);
        String weekdayStr = getWeekdayName(dateTime.getDayOfWeek().getValue());
        output2 += " " + weekdayStr;
        System.out.println("格式2: " + output2); // 格式2: 2000/01/02 03:44:55 星期日

        String output3 = dateTime.format(formatter3);
        System.out.println("格式3: " + output3); // 格式3: 01-02 03:44

        // 如果是 ZonedDateTime, 有时区信息,所以可以输出时区信息
        ZonedDateTime zonedDateTime = dateTime.atZone(ZoneId.systemDefault());
        DateTimeFormatter formatter4 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm zzzz");
        String output4 = zonedDateTime.format(formatter4);
        System.out.println("格式4: " + output4); // 格式4: 2000-01-02 03:44 中国标准时间
    }

    private static String getWeekdayName(int dayOfWeek) {
        switch (dayOfWeek) {
            case 1:
                return "星期一";
            case 2:
                return "星期二";
            case 3:
                return "星期三";
            case 4:
                return "星期四";
            case 5:
                return "星期五";
            case 6:
                return "星期六";
            case 7:
                return "星期日";
            default:
                return "未知";
        }
    }

}

(2) 所有Java版本都能用

// 时间格式化示例
public class ATest {
    public static void main(String[] args) {

        // 这里模拟一个时间:  2000-01-02 03:44:55
        Calendar calendar = Calendar.getInstance();
        calendar.set(2000, 0, 2, 3, 44, 55);
        Date date = calendar.getTime();

        // 定义格式化器
        SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss E");
        SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        SimpleDateFormat formatter3 = new SimpleDateFormat("MM-dd HH:mm");

        // 格式化输出
        String output1 = formatter1.format(date);
        System.out.println("格式1: " + output1); // 格式1: 2000/01/02 03:44:55 周日

        String output2 = formatter2.format(date);
        String weekdayStr = getWeekdayName(calendar.get(Calendar.DAY_OF_WEEK));
        output2 += " " + weekdayStr;
        System.out.println("格式2: " + output2); // 格式2: 2000/01/02 03:44:55 星期日

        String output3 = formatter3.format(date);
        System.out.println("格式3: " + output3); //格式3: 01-02 03:44

        // 如果需要输出时区信息
        SimpleDateFormat formatter4 = new SimpleDateFormat("yyyy-MM-dd HH:mm zzzz");
        String output4 = formatter4.format(date);
        System.out.println("格式4: " + output4); // 格式4: 2000-01-02 03:44 中国标准时间
    }

    // 将数字转换为星期几的名称
    private static String getWeekdayName(int dayOfWeek) {
        switch (dayOfWeek) {
            case Calendar.SUNDAY:
                return "星期日";
            case Calendar.MONDAY:
                return "星期一";
            case Calendar.TUESDAY:
                return "星期二";
            case Calendar.WEDNESDAY:
                return "星期三";
            case Calendar.THURSDAY:
                return "星期四";
            case Calendar.FRIDAY:
                return "星期五";
            case Calendar.SATURDAY:
                return "星期六";
            default:
                return "未知";
        }
    }

}

从字符串解析日期

  1. 没有时区信息的情况: 将字符串 "2000-01-01 22:33:55"转为日期

    (1) Java8+

    // 字符串转为日期对象
    
    String dateStr = "2000-01-02 03:44:55";
    // 定义日期时间格式
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    
    // 解析字符串为 LocalDateTime
    LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter);
    System.out.println("解析后的时间: " + dateTime); //解析后的时间: 2000-01-02T03:44:55
    
    int year = dateTime.getYear();
    int month = dateTime.getMonthValue();
    int day = dateTime.getDayOfMonth();
    int hour = dateTime.getHour();
    int minute = dateTime.getMinute();
    int sec = dateTime.getSecond();
    // Output: 2000-1-2 3:44:55
    System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + sec);
    

    (2) 所有Java版本都适用

    // 字符串转为日期对象
    
    String dateStr="2000-01-02 03:44:55";
    
    // 假如dateStr="2000-01-01 22:33:55.123" 也能解析, 信息只能多不能少,
    // 如dateStr="2000-01-01T22:33:55.123",
    // 则 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    // 解析字符串为 Date 对象
    Date date = null;
    try {
        date = format.parse(dateStr);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
    
    // Output: 解析后的时间: 2000-01-02 03:44:55
    System.out.println("解析后的时间: " + format.format(date));
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    int sec = calendar.get(Calendar.SECOND);
    
    // Output: 2000-1-2 3:44:55
    System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + sec);
    
  2. 有时区信息的情况: 将字符串 "2000-01-01T22:33:55.123Z"或"2000-01-01T22:33:55.123+02:00"转为本地时区时间显示

​ (1) Java8+

// 解析有时区信息的时间字符串

// String dateStr = "2020-01-02T03:44:55.123+02:00";
// Z代表UTC时间,北京时间是UTC+8小时 (+08:00)
String dateStr = "2020-01-02T03:44:55.123Z";

// XXX 这个是控制时区显示格式的
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

// 也可用ZonedDateTime, OffsetDateTime只记录时区偏移,比如+8小时, 用法跟ZonedDateTime差不多
// ZonedDateTime要记录更多信息,比如时区规则(如 Asia/Shanghai),可以处理夏令时等复杂时区问题
//  ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter);
//  System.out.println(zonedDateTime);

// 解析带时区的时间
OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateStr);
System.out.println(offsetDateTime); // 2020-01-02T03:44:55.123Z

// 转换为本地时区时间, (测试机器的时区是北京时间的时区)
LocalDateTime localDateTime = offsetDateTime.atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime();
// 格式化输出
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(localDateTime.format(formatter1)); // 2020-01-02 11:44:55

(2) 所有Java版本都适用

// 解析有时区信息的时间字符串

//        String dateStr = "2020-01-02T03:44:55.123+02:00";
// Z代表UTC时间,北京时间是UTC+8小时 (+08:00)
String dateStr = "2020-01-02T03:44:55.123Z";

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date date = null;
try {
    date = format.parse(dateStr);
} catch (ParseException e) {
    throw new RuntimeException(e);
}

// 转换为本地时区格式
SimpleDateFormat localFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 可以不用设置,因为默认就是本地的时区
// localFormat.setTimeZone(TimeZone.getDefault()); // 使用本地时区

String localTime = localFormat.format(date);
System.out.println(localTime);  // Output: 2020-01-02 11:44:55
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大勇学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值