在 Java 中配置时区

可以通过各种方法在 Java 中配置时区,使应用程序能够在所需的时区上下文中运行。 两种常见方法是设置 TZ 环境变量并指定 JVM 属性 -Duser.timezone。 本文简要概述了这两种方法。

设置 TZ 环境变量

TZ 环境变量是设置在类似 Unix 操作系统上运行的应用程序的时区的标准方法。 设置此变量时,Java 虚拟机(JVM)会在启动期间选取时区设置。

在 OS 级别设置 TZ 环境变量

使用以下步骤在操作系统级别设置 TZ 环境变量:

  1. 确定所需的时区。 时区通常以“区域/位置”格式指定,例如“美国/New_York”或“欧洲/伦敦”。

  2. 使用以下方法之一设置 TZ 环境变量:

    • 在 Unix/Linux 系统上,使用以下命令在终端或 shell 配置文件(.bashrc.bash_profile.zshrc等)中设置变量:

      export TZ=America/New_York
      
    • 在 Windows 系统上,使用以下命令在命令提示符或系统环境设置中设置变量:

      set TZ=America/New_York
      
  3. 重启应用程序,以便 JVM 可以选取新的时区设置。

在以下示例中,应用程序 myapp.jarEurope/London 时区中运行:

export TZ=Europe/London
java -jar myapp.jar

在 Dockerfile 中设置 TZ 环境变量

在容器中运行 Java 应用程序时,可以在 Dockerfile 中设置 TZ 环境变量,以确保容器在所需的时区中运行。

Dockerfile 示例

以下示例通过设置 TZ 环境变量并安装 tzdata 包,将容器配置为使用 America/New_York 时区:

# Use a base image with Java installed
FROM mcr.microsoft.com/openjdk/jdk:21-mariner

# Set the timezone environment variable
ENV TZ=America/New_York

# Set the working directory
WORKDIR /app

# Copy the application JAR file to the container
COPY myapp.jar /app/myapp.jar

# Run the application
CMD ["java", "-jar", "myapp.jar"]

设置 JVM 属性 -Duser.timezone

在 Java 中配置时区的另一种方法是在启动 JVM 时指定 -Duser.timezone 属性。 此方法独立于平台,可直接从命令行或在应用程序脚本中设置时区。 此 JVM 属性优先于环境变量 TZ

使用以下步骤设置 -Duser.timezone 属性:

  1. 确定所需的时区。 与 TZ 环境变量类似,时区以“区域/位置”格式指定。

  2. 启动应用程序时,通过将其添加到 Java 命令行来设置 -Duser.timezone 属性,如以下示例所示:

    java -Duser.timezone=America/New_York -jar myapp.jar
    

在以下示例中,应用程序 myapp.jarAsia/Tokyo 时区中运行:

java -Duser.timezone=Asia/Tokyo -jar myapp.jar

其他系统和环境

可以使用 TZ 环境变量和 -Duser.timezone JVM 属性将 Java 中配置时区的原则应用于其他系统和环境。 无论是在云平台、虚拟机(VM)还是在各种容器业务流程系统中运行应用程序,都可以使用相同的方法来确保 Java 应用程序在正确的时区上下文中运行。

在云平台上,在部署脚本或环境配置设置中配置 TZ 环境变量或 JVM 属性。

在虚拟机上,在 VM 环境中设置 TZ 环境变量,或在应用程序启动脚本中使用 JVM 属性。

使用容器业务流程时,对容器化应用程序使用 Dockerfile 示例,确保时区数据可用并正确设置。

通过遵循这些原则,可以在 Java 应用程序的不同部署环境中实现一致的时区配置。