Java 日期格式:详细指南

导航至

日期格式化在软件开发中起着至关重要的作用,尤其是在 Java 编程中,开发者经常需要处理日期和时间。Java 提供了一套丰富的类和方法来处理这个问题,使开发者能够创建不仅准确而且用户友好的应用程序。

在本篇详尽的指南中,我们将探讨 Java 中日期格式化的各个方面,包括 LocalDateLocalTimeLocalDateTimeTimestampTimeZone 等类。通过详细的解释、实际的示例和动手练习,开发者将全面了解如何在 Java 应用程序中有效地管理日期。

日期格式化在 Java 中的重要性

有效的日期格式化在 Java 编程中提供了多种好处

  • 可读性。 格式良好的日期可以增强代码的可读性,使开发者更容易理解和维护代码。
  • 本地化。 不同地区有不同的日期和时间格式。正确的格式化保证了日期符合文化习惯,并以用户熟悉的格式呈现。
  • 互操作性。 一致的日期格式化促进了不同系统和应用程序之间无缝的数据交换。

日期格式化在 Java 中如何工作

Java 提供了几个类和方法来格式化和解析日期。让我们探讨一些重要的类和方法

java.util.Date

尽管 java.util.Date 已被弃用,但开发者仍然经常使用它。它表示时间轴上的特定时刻,但缺乏特定的格式,主要用于时间戳计算。请参阅下面的实际示例,了解如何使用 java.util.Date 包来检索当前日期和时间,并确定一小时后的日期和时间。

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        // Creating a Date object representing the current date and time
        Date currentDate = new Date();

        // Printing the current date and time represented by the Date object
        System.out.println("Current Date and Time (java.util.Date): " + currentDate);

        // Performing timestamp calculations
        long currentTimeMillis = currentDate.getTime(); // Getting the current time in milliseconds
        long oneHourInMillis = 3600_000; // One hour in milliseconds
        long oneHourLaterInMillis = currentTimeMillis + oneHourInMillis; // Adding one hour to the current time

        // Creating a new Date object representing one hour later
        Date oneHourLaterDate = new Date(oneHourLaterInMillis);

        // Printing the timestamp calculation results
        System.out.println("One Hour Later (java.util.Date): " + oneHourLaterDate);
    }
}
代码输出

java.sql.Date

java.sql.Date 类扩展了 java.util.Date,专门用于与数据库交互。它通常在 JDBC 编程中用于表示 SQL 数据库中的日期。下面的代码演示了 java.sql.Date 在 JDBC 上下文中处理日期的基本用法。具体来说,代码说明了它在涉及与 SQL 数据库交互的场景中的应用。

import java.sql.Date;

public class Main {
    public static void main(String[] args) {
        // Creating a java.sql.Date object representing the current date
        java.sql.Date currentDate = new java.sql.Date(System.currentTimeMillis());

        // Printing the current date represented by the java.sql.Date object
        System.out.println("Current Date (java.sql.Date): " + currentDate);

        // Creating a java.sql.Date object from a specific date string (yyyy-MM-dd format)
        String dateString = "2024-01-31";
        java.sql.Date specificDate = java.sql.Date.valueOf(dateString);

        // Printing the specific date represented by the java.sql.Date object
        System.out.println("Specific Date (java.sql.Date): " + specificDate);
    }
}
代码输出

SimpleDateFormat

SimpleDateFormat 类提供了一种使用模式格式化和解析日期的方法。它允许开发者根据特定的模式定义自定义日期格式,例如“yyyy-mm-dd”和“yyyy-mm-dd HH:mm:ss”分别表示年-月-日和年-月-日-时-分-秒格式。以下示例演示了如何使用 SimpleDateFormat 根据特定模式格式化和解析日期。

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

public class Main {
    public static void main(String[] args) {
        // Creating a SimpleDateFormat object with a custom date pattern
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // Formatting the current date and time using the specified pattern
        String formattedDate = dateFormat.format(new Date());

        // Printing the formatted date
        System.out.println("Formatted Date (SimpleDateFormat): " + formattedDate);

        // Parsing a date string into a Date object using the same pattern
        String dateString = "2024-01-31 15:30:00";
        try {
            Date parsedDate = dateFormat.parse(dateString);
            System.out.println("Parsed Date (SimpleDateFormat): " + parsedDate);
        } catch (ParseException e) {
            System.out.println("Error parsing the date: " + e.getMessage());
        }
    }
}
代码输出

解析日期和 parse() 方法

SimpleDateFormat 中的 parse() 方法用于根据指定的格式模式将字符串解析为日期对象。请参阅下面的示例。

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

public class Main {
    public static void main(String[] args) {
        // Define a date string to be parsed
        String dateString = "2024-01-31";

        // Define the date format pattern
        String inputPattern = "yyyy-MM-dd";

        // Create a SimpleDateFormat object with the specified input pattern
        SimpleDateFormat inputFormat = new SimpleDateFormat(inputPattern);

        try {
            // Parse the date string into a Date object using the parse() method
            Date parsedDate = inputFormat.parse(dateString);

            // Define a different output date format pattern
            String outputPattern = "yyyy/MM/dd";

            // Create a SimpleDateFormat object with the specified output pattern
            SimpleDateFormat outputFormat = new SimpleDateFormat(outputPattern);

            // Format the parsed date using the different pattern
            String formattedDate = outputFormat.format(parsedDate);

            // Print the formatted date
            System.out.println("Parsed Date (parse() method): " + formattedDate);
        } catch (ParseException e) {
            // Handle parsing exception
            System.out.println("Error parsing the date: " + e.getMessage());
        }
    }
}
代码输出

LocalDate、LocalTime 和 LocalDateTime

LocalDateLocalTimeLocalDateTime 类属于 java.time 包,分别提供不可变的日期、时间和日期时间对象。它们提供了各种格式化和解析日期的方法,而无需显式模式定义。这是一个例子

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;

public class Main {
    public static void main(String[] args) {
        // Creating a LocalDate object representing the current date
        LocalDate currentDate = LocalDate.now();

        // Creating a LocalTime object representing the current time
        LocalTime currentTime = LocalTime.now();

        // Creating a LocalDateTime object representing the current date and time
        LocalDateTime currentDateTime = LocalDateTime.now();

        // Printing the current date, time, and date-time
        System.out.println("Current Date (LocalDate): " + currentDate);
        System.out.println("Current Time (LocalTime): " + currentTime);
        System.out.println("Current Date and Time (LocalDateTime): " + currentDateTime);
    }
}
代码输出

TimeZone

在 Java 中,TimeZone 类指示时区偏移量,并有助于确定夏令时。它允许开发者在不同地区处理日期和时间,考虑到夏令时变化和其他时区调整。此代码使用 TimeZone 类来检索和显示有关 Java 运行时环境使用的默认时区的信息。

import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        // Get the default time zone
        TimeZone defaultTimeZone = TimeZone.getDefault();

        // Print the default time zone ID
        System.out.println("Default Timezone ID: " + defaultTimeZone.getID());

        // Print the display name of the default time zone
        System.out.println("Default Timezone Display Name: " + defaultTimeZone.getDisplayName());
    }
}
代码输出

Timestamp

Java 中的 Timestamp 类扩展了 java.util.Date,表示时间轴上的特定时刻,包括日期和时间信息,精度为纳秒。开发者通常在处理数据库操作或需要更精确的时间戳时使用它。下面的代码创建了一个 Timestamp 对象,表示当前时间,精度为纳秒。

import java.sql.Timestamp;

public class Main {
    public static void main(String[] args) {
        // Create a Timestamp object representing the current time
        Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis());

        // Print the current timestamp
        System.out.println("Current Timestamp: " + currentTimestamp);
    }
}
代码输出

如何在 Java 中格式化日期

Java 提供了几种格式化日期的方法,包括使用 SimpleDateFormat(我们在后续章节中介绍)进行自定义模式,以及使用 DateTimeFormatter 进行更强大的格式化选项。以下示例演示了 DateTimeFormatter 在 Java 中格式化日期的用法。

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

public class Main {
    public static void main(String[] args) {
        // Define a LocalDateTime object representing the current date and time
        LocalDateTime currentDateTime = LocalDateTime.now();

        // Define a custom date-time format pattern
        String pattern = "yyyy-MM-dd HH:mm:ss";

        // Create a DateTimeFormatter object with the specified pattern
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);

        // Format the current date and time using the formatter
        String formattedDateTime = currentDateTime.format(formatter);

        // Print the formatted date and time
        System.out.println("Formatted Date and Time (DateTimeFormatter): " + formattedDateTime);
    }
}
代码输出

如何在 Java 中将字符串转换为日期

要在 Java 中将字符串转换为日期,可以使用 SimpleDateFormatDateTimeFormatter 根据指定的格式模式解析字符串。下面的示例演示了如何使用 SimpleDateFormat 将表示日期 (01/31/2024) 的字符串解析为日期对象。

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

public class Main {
    public static void main(String[] args) {
        // Define a date string to be parsed
        String dateString = "01/31/2024";

        // Define the date format pattern
        String pattern = "MM/dd/yyyy";

        // Create a SimpleDateFormat object with the specified pattern
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);

        try {
            // Parse the date string into a Date object using the parse() method
            Date parsedDate = dateFormat.parse(dateString);

            // Print the parsed date
            System.out.println("Parsed Date (SimpleDateFormat): " + dateFormat.format(parsedDate));
        } catch (ParseException e) {
            // Handle parsing exception
            System.out.println("Error parsing the date: " + e.getMessage());
        }
    }
}
代码输出

如何在 Java 中获取系统日期和时间

Java 提供了实用程序方法,可以使用 LocalDateLocalTimeLocalDateTimeZonedDateTime 等类检索当前系统日期和时间。以下示例演示了如何使用这些类检索当前系统日期和时间。

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        // Retrieve the current system date
        LocalDate currentDate = LocalDate.now();

        // Retrieve the current system time
        LocalTime currentTime = LocalTime.now();

        // Retrieve the current system date and time
        LocalDateTime currentDateTime = LocalDateTime.now();

        // Retrieve the current system date and time with time zone information
        ZonedDateTime zonedDateTime = ZonedDateTime.now();

        // Print the current system date and time
        System.out.println("Current System Date: " + currentDate);
        System.out.println("Current System Time: " + currentTime);
        System.out.println("Current System Date and Time: " + currentDateTime);
        System.out.println("Current System Date and Time with Time Zone: " + zonedDateTime);
    }
}

代码输出

日期格式化在 Java 中的实际应用

您可以尝试以下练习以提高您的理解

1. 创建一个方法,将给定的 LocalDateTime 对象格式化为自定义日期时间格式。

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

public class Main {

    public static String formatDateTime(LocalDateTime dateTime, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return dateTime.format(formatter);
    }

    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        String pattern = "dd/MM/yyyy HH:mm:ss";
        String customFormat = formatDateTime(dateTime, pattern);
        System.out.println("Formatted Date and Time: " + customFormat);
    }
}
代码输出

2. 实现一个函数,将特定格式的日期字符串解析为 LocalDate 对象。

解决方案
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Main {

    public static LocalDate parseStringToDate(String dateString) {
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
        return LocalDate.parse(dateString, formatter);
    }

    public static void main(String[] args) {
        String dateString = "2024-01-31";
        LocalDate parsedDate = parseStringToDate(dateString);
        System.out.println("Parsed Date: " + parsedDate);
    }
}
代码输出

3. 开发一个实用程序,将从数据库检索的时间戳转换为具有适当时区的 LocalDateTime 对象。

解决方案
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class Main {

    public static LocalDateTime convertTimestampToLocalDateTime(long timestamp, String timezone) {
        Instant instant = Instant.ofEpochMilli(timestamp);
        return LocalDateTime.ofInstant(instant, ZoneId.of(timezone));
    }

    public static void main(String[] args) {
        long timestamp = 1643614800000L;
        String timezone = "America/New_York";
        LocalDateTime dateTime = convertTimestampToLocalDateTime(timestamp, timezone);
        System.out.println("Converted Date and Time: " + dateTime);
    }
}
代码输出

结论

本指南全面探讨了 Java 丰富的日期格式化功能,突出了它们在软件开发中的关键作用。通过掌握这些方法并理解时间戳和时区处理的细微差别,开发者可以确保其 Java 应用程序的准确性、适应性和用户友好性。

本文由 Theophilus Onyejiaku 撰写。Theophilus 拥有超过 5 年的数据科学家和机器学习工程师经验。他在数据科学、机器学习、计算机视觉、深度学习、对象检测、模型开发和部署领域积累了专业知识。他已在上述领域、Python 编程、数据分析等领域撰写了 660 多篇文章。