Menu
CoddyTech

时区处理

本课属于 Coddy Java 学习旅程的“逻辑与流程”单元。第 59 课,共 59 课。

Java 中的 ZonedDateTime 表示带时区的日期和时间。处理不同时区或在它们之间进行转换时,它很有用。

在特定时区创建时间:

ZonedDateTime tokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

你还可以使用 .atZone() 从 LocalDateTime 创建 ZonedDateTime:

LocalDateTime localDT = LocalDateTime.of(2024, 3, 15, 10, 30);
ZonedDateTime tokyo = localDT.atZone(ZoneId.of("Asia/Tokyo"));

转换不同时区之间的时间:

ZonedDateTime newYork = tokyo.withZoneSameInstant(ZoneId.of("America/New_York"));

运行上述代码后,newYork 包含与 tokyo 相同的时刻,但使用纽约的时区:

2024-03-15T10:30-04:00[America/New_York]
// 示例输出

要格式化 ZonedDateTime,请使用 DateTimeFormatter。使用 xxx 模式添加偏移量:它会输出 +09:00 或 -04:00,零偏移量则输出 +00:00(大写的 XXX 在零偏移量时会输出 Z):

// 不带时区偏移量
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
// 带时区偏移量(例如 +09:00 或 -04:00)
DateTimeFormatter fmtWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String result = newYork.format(fmtWithOffset);
// 示例:2024-03-15 10:30 -04:00
challenge icon

挑战

简单

创建一个名为 convertTime 的方法,它接受四个参数:

  1. 一个字符串(dateTimeStr),格式为 "yyyy-MM-dd HH:mm"
  2. 一个字符串(sourceZone),表示源时区 ID
  3. 一个字符串(targetZone),表示目标时区 ID
  4. 一个布尔值(showOffset),表示是否在输出中包含时区偏移量

该方法应当:

  1. 解析源时区中的输入日期时间
  2. 将其转换为目标时区
  3. 返回两个时间的格式化信息

返回的消息应为:

  • 如果日期时间无效:返回 "Invalid datetime format"
  • 如果时区无效:返回 "Invalid time zone"
  • 如果 showOffset 为 true:在输出中包含偏移量,并使用 xxx 格式化,因此零偏移量会显示为 +00:00
  • 格式:"Source: [time1], Target: [time2]"

亲手试试

import java.util.Scanner;
import java.time.*;
import java.time.format.*;

public class Main {
    public static String convertTime(String dateTimeStr, String sourceZone, 
                                   String targetZone, boolean showOffset) {
        // 在这里编写你的代码
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String dateTimeStr = scanner.nextLine();
        String sourceZone = scanner.nextLine();
        String targetZone = scanner.nextLine();
        boolean showOffset = Boolean.parseBoolean(scanner.nextLine());
        
        System.out.println(convertTime(dateTimeStr, sourceZone, targetZone, showOffset));
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Java 在线编译器