杰瑞科技汇

string转datetime java,如何正确转换?

下面我将详细介绍如何使用 java.time API 来完成这个任务,并提供不同场景下的代码示例。

string转datetime java,如何正确转换?-图1


核心概念

  1. DateTimeFormatter: 这是将字符串解析为日期时间对象,或将日期时间对象格式化为字符串的关键,它定义了日期时间的格式模式。
  2. LocalDateTime: 表示一个不带时区的本地日期和时间(2025-10-27T10:15:30)。
  3. ZonedDateTime: 表示一个带有时区的日期时间(2025-10-27T10:15:30+08:00[Asia/Shanghai])。
  4. Instant: 表示时间线上的一个瞬时点,通常用于表示机器时间。

使用 LocalDateTime(最常用)

如果你的字符串不包含时区信息,或者你不需要关心时区,使用 LocalDateTime 是最合适的选择。

使用预定义的格式

DateTimeFormatter 提供了一些预定义的格式,用于处理常见的标准格式。

示例:解析 ISO 格式字符串(yyyy-MM-ddTHH:mm:ss

string转datetime java,如何正确转换?-图2

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class StringToLocalDateTime {
    public static void main(String[] args) {
        String dateTimeStr = "2025-10-27T15:30:00";
        // 预定义的 ISO_LOCAL_DATE_TIME 格式可以直接解析这种字符串
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr);
        System.out.println("解析后的 LocalDateTime: " + dateTime);
        // 输出: 解析后的 LocalDateTime: 2025-10-27T15:30
    }
}

示例:解析其他常见格式

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class StringToLocalDateTimeExample {
    public static void main(String[] args) {
        // 情况1: 字符串格式为 "yyyy-MM-dd HH:mm:ss"
        String str1 = "2025-10-27 15:30:00";
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime dateTime1 = LocalDateTime.parse(str1, formatter1);
        System.out.println("格式1: " + dateTime1); // 输出: 格式1: 2025-10-27T15:30
        // 情况2: 字符串格式为 "yyyy/MM/dd HH:mm"
        String str2 = "2025/10/27 15:30";
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
        LocalDateTime dateTime2 = LocalDateTime.parse(str2, formatter2);
        System.out.println("格式2: " + dateTime2); // 输出: 格式2: 2025-10-27T15:30
        // 情况3: 字符串格式为 "dd-MM-yyyy"
        String str3 = "27-10-2025";
        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("dd-MM-yyyy");
        LocalDateTime dateTime3 = LocalDateTime.parse(str3, formatter3);
        System.out.println("格式3: " + dateTime3); // 输出: 格式3: 2025-10-27T00:00
    }
}

DateTimeFormatter 常用模式字符:

符号 含义 示例
y yyyy (2025), yy (23)
M MM (10), M (10)
d 月中的天 dd (27), d (27)
H 小时 (0-23) HH (15)
h 小时 (1-12) hh (03)
m 分钟 mm (30)
s ss (00)
S 毫秒 SSS (123)
a 上午/下午标记 AMPM
T 时间分隔符 用于 LocalDateTimeyyyy-MM-ddTHH:mm:ss 格式

使用 ZonedDateTime(处理时区)

如果你的字符串包含时区信息(如 +08:00Asia/Shanghai),你应该使用 ZonedDateTime

string转datetime java,如何正确转换?-图3

解析带时区偏移的字符串 (e.g., +08:00)

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public StringToZonedDateTimeExample {
    public static void main(String[] args) {
        String dateTimeStrWithOffset = "2025-10-27T15:30:00+08:00";
        // 使用 ISO_ZONED_DATE_TIME 格式自动解析
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTimeStrWithOffset);
        System.out.println("解析后的 ZonedDateTime: " + zonedDateTime);
        // 输出: 解析后的 ZonedDateTime: 2025-10-27T15:30+08:00
    }
}

解析带时区ID的字符串 (e.g., Asia/Shanghai)

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public StringToZonedDateTimeExample2 {
    public static void main(String[] args) {
        String dateTimeStrWithZoneId = "2025-10-27T15:30:00 Asia/Shanghai";
        // 需要自定义格式来解析时区ID
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss z");
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTimeStrWithZoneId, formatter);
        System.out.println("解析后的 ZonedDateTime: " + zonedDateTime);
        // 输出: 解析后的 ZonedDateTime: 2025-10-27T15:30+08:00[Asia/Shanghai]
    }
}

处理旧版 java.util.Date

如果你需要与一些遗留系统交互,这些系统仍在使用 java.util.Date,你可以进行转换。

String -> LocalDateTime -> Date

import java.time.*;
import java.util.Date;
public StringToDateExample {
    public static void main(String[] args) {
        String dateTimeStr = "2025-10-27T15:30:00";
        // 1. String -> LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr);
        // 2. LocalDateTime -> ZonedDateTime (指定一个时区,例如系统默认时区)
        ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
        // 3. ZonedDateTime -> Instant
        Instant instant = zonedDateTime.toInstant();
        // 4. Instant -> Date
        Date date = Date.from(instant);
        System.out.println("原始字符串: " + dateTimeStr);
        System.out.println("转换后的 java.util.Date: " + date);
    }
}

完整示例与最佳实践

下面是一个综合示例,展示了如何处理各种格式,并处理可能的解析错误。

import java.time.*;
import java.time.format.*;
import java.util.*;
public StringParsingBestPractice {
    public static void main(String[] args) {
        // --- 场景1: 标准ISO格式,无需指定格式 ---
        String isoStr = "2025-10-27T10:00:00";
        LocalDateTime dt1 = LocalDateTime.parse(isoStr);
        System.out.println("1. 解析ISO格式: " + dt1);
        // --- 场景2: 自定义格式,必须指定格式 ---
        String customStr = "27/10/2025 08:30 PM";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a");
        try {
            LocalDateTime dt2 = LocalDateTime.parse(customStr, formatter);
            System.out.println("2. 解析自定义格式: " + dt2);
        } catch (DateTimeParseException e) {
            System.err.println("解析失败: " + e.getMessage());
        }
        // --- 场景3: 带时区信息的字符串 ---
        String zonedStr = "2025-10-27T10:00:00[Europe/Paris]";
        ZonedDateTime zdt1 = ZonedDateTime.parse(zonedStr);
        System.out.println("3. 解析带时区ID: " + zdt1);
        // --- 场景4: 从用户输入解析,并处理错误 ---
        Scanner scanner = new Scanner(System.in);
        System.out.print("\n请输入一个日期时间 (格式: yyyy-MM-dd HH:mm): ");
        String userInput = scanner.nextLine();
        try {
            // 定义与用户输入相匹配的格式

分享:
扫描分享到社交APP
上一篇
下一篇