如何在 Java 中不使用 SimpleDateFormat 将字符串日期转换为时间戳

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在 Java 中,处理日期和时间戳是一项常见任务,而 SimpleDateFormat 类经常用于此目的。但是,有一些不依赖 SimpleDateFormat 将字符串日期转换为时间戳的替代方法。本教程将指导你使用这些替代方法将字符串日期转换为 Java 时间戳的过程。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/output("Output") java/BasicSyntaxGroup -.-> java/type_casting("Type Casting") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/date("Date") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/format("Format") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/output -.-> lab-413977{{"如何在 Java 中不使用 SimpleDateFormat 将字符串日期转换为时间戳"}} java/type_casting -.-> lab-413977{{"如何在 Java 中不使用 SimpleDateFormat 将字符串日期转换为时间戳"}} java/date -.-> lab-413977{{"如何在 Java 中不使用 SimpleDateFormat 将字符串日期转换为时间戳"}} java/format -.-> lab-413977{{"如何在 Java 中不使用 SimpleDateFormat 将字符串日期转换为时间戳"}} java/string_methods -.-> lab-413977{{"如何在 Java 中不使用 SimpleDateFormat 将字符串日期转换为时间戳"}} end

理解 Java 时间戳

Java 时间戳是一种数据类型,用于表示特定的日期和时间,具有纳秒精度。它常用于数据库应用程序、日志文件以及其他需要精确时间信息的场景。

Java 中的 Timestamp 类是 java.sql 包的一部分,它扩展了 java.util.Date 类。它提供了用于处理日期和时间值的方法,例如获取当前时间、设置时间以及对时间戳执行算术运算。

以下是在 Java 中创建 Timestamp 对象的示例:

Timestamp timestamp = new Timestamp(System.currentTimeMillis());

这将创建一个包含当前日期和时间的 Timestamp 对象。

时间戳通常与数据库结合使用,可作为表中的一列进行存储。它们还可用于日志记录、调度以及其他基于时间的操作。

关于时间戳需要注意的一个重要事项是,默认情况下它们基于协调世界时(UTC)时区。这意味着如果你在不同的时区创建一个 Timestamp 对象,其值可能与你预期的不同。要在特定时区使用时间戳,你可以使用 Java 中的 TimeZone 类。

graph LR A[时间戳] --> B[java.util.Date] B --> C[java.sql.Timestamp] C --> D[数据库] C --> E[日志记录] C --> F[调度]
特性 描述
精度 纳秒精度
时区 默认 UTC
用例 数据库、日志记录、调度

将字符串日期转换为时间戳

在 Java 编程中,一项常见任务是将日期的字符串表示形式转换为 Timestamp 对象。在处理来自外部源(如数据库或 Web 服务)的数据时,通常需要这样做,因为这些数据源提供的日期是以字符串形式呈现的。

执行此转换的传统方法是使用 SimpleDateFormat 类,它允许你将字符串日期解析为 java.util.Date 对象,然后从该 Date 对象创建一个 Timestamp 对象。

然而,SimpleDateFormat 类存在一些局限性,例如对输入格式和区域设置敏感,如果输入字符串不符合预期格式,很容易抛出异常。

为避免这些问题,你可以使用 Java 8 中引入的 java.time 包。该包提供了一种更强大、更灵活的方式来处理日期和时间,包括无需使用 SimpleDateFormat 将字符串日期转换为 Timestamp 对象的功能。

以下是使用 java.time 包将字符串日期转换为 Timestamp 对象的示例:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class StringToTimestamp {
    public static void main(String[] args) {
        String dateString = "2023-04-18 12:34:56";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.parse(dateString, formatter);
        Timestamp timestamp = Timestamp.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
        System.out.println(timestamp);
    }
}

在此示例中,我们首先定义一个日期和时间的字符串表示形式。然后创建一个 DateTimeFormatter 对象,将字符串解析为 LocalDateTime 对象。最后,使用 Timestamp.from() 方法将 LocalDateTime 对象转换为 Timestamp 对象。

这种方法比使用 SimpleDateFormat 更强大、更灵活,因为它对输入格式和区域设置不太敏感,并且还提供了更好的错误处理。

graph LR A[字符串日期] --> B[DateTimeFormatter] B --> C[LocalDateTime] C --> D[Timestamp] D --> E[数据库] D --> F[日志记录] D --> G[调度]
步骤 描述
1. 定义字符串日期 "2023-04-18 12:34:56"
2. 创建 DateTimeFormatter DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
3. 将字符串解析为 LocalDateTime LocalDateTime.parse(dateString, formatter)
4. 将 LocalDateTime 转换为 Timestamp Timestamp.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())

时间戳转换的其他方法

虽然 java.time 包提供了一种强大且灵活的方式将字符串日期转换为 Timestamp 对象,但在 Java 生态系统中还有其他一些方法。以下是一些示例:

使用 Apache Commons Lang

Apache Commons Lang 库提供了一个 DateUtils 类,可用于将字符串日期转换为 Timestamp 对象。以下是一个示例:

import org.apache.commons.lang3.time.DateUtils;

public class StringToTimestampWithApacheCommons {
    public static void main(String[] args) {
        String dateString = "2023-04-18 12:34:56";
        Timestamp timestamp = new Timestamp(DateUtils.parseDate(dateString, "yyyy-MM-dd HH:mm:ss").getTime());
        System.out.println(timestamp);
    }
}

在此示例中,我们使用 DateUtils.parseDate() 方法将字符串日期转换为 java.util.Date 对象,然后从该 Date 对象创建一个 Timestamp 对象。

使用 Joda-Time

Joda-Time 是一个在 Java 中处理日期和时间的流行库。它提供了一套更全面的工具来处理日期和时间操作,包括将字符串日期转换为 Timestamp 对象的功能。以下是一个示例:

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class StringToTimestampWithJodaTime {
    public static void main(String[] args) {
        String dateString = "2023-04-18 12:34:56";
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
        DateTime dateTime = formatter.parseDateTime(dateString);
        Timestamp timestamp = new Timestamp(dateTime.getMillis());
        System.out.println(timestamp);
    }
}

在此示例中,我们使用 DateTimeFormat 类创建一个 DateTimeFormatter 对象,然后用它将字符串日期解析为 DateTime 对象。接着我们从 DateTime 对象创建一个 Timestamp 对象。

比较

优点 缺点
java.time - 强大且灵活
- 是 Java 标准库的一部分
- 需要 Java 8 或更高版本
Apache Commons Lang - 简单易用
- 支持多种日期/时间格式
- 需要外部库
Joda-Time - 用于日期/时间操作的全面工具集
- 支持多种日期/时间格式
- 需要外部库
- 对于 Java 开发者来说可能不太熟悉

最终,选择使用哪种方法将取决于你的具体需求以及你所使用的 Java 版本。对于现代 Java 开发,通常推荐使用 java.time 包,但在某些情况下其他选项也可能有用。

总结

在本教程结束时,你将学会如何在不使用 SimpleDateFormat 类的情况下,高效地将字符串日期转换为 Java 时间戳。你将探索各种替代方法,例如 Java 时间 API 和其他内置方法,以便在 Java 应用程序中处理日期和时间转换。这些知识将帮助你在 Java 中处理日期和时间戳时编写更健壮、更易于维护的代码。