这会给我正确的用户本地时间吗?

问题描述

我需要找出一种可靠地获取用户本地时间的方法。经过研究,一种可能的解决方案可能是:

用户所在位置的星期几:

int dayOfWeek = zoneddatetime.Now(Clock.systemDefaultZone()).getDayOfWeek().ordinal();

用户所在位置的实际时间:

LocalDateTime.Now(Clock.systemDefaultZone()));

这一切正确吗?我是否正确使用Clock.systemDefaultZone()?如果是这样,我想知道Clock.systemDefaultZone()如何能够神奇地找出正确的时区?

解决方法

请注意,在第一个示例中,您不需要ZonedDateTimeLocalDate就可以了,因为您只关心星期几,而不关心那一天的时间。另外请注意,LocalDate.now()使用系统默认时钟,您无需明确指定它。

关于默认时钟Clock.systemDefaultZone()基于系统默认时区,该时区可通过查询TimeZone.getDefault()来获取:

获取Java虚拟机的默认TimeZone。如果缓存的默认TimeZone可用,则返回其克隆。否则,该方法将按照以下步骤确定默认时区。

  • 使用user.timezone属性值作为默认时区ID(如果可用)。
  • 检测平台时区ID。平台时区和ID映射的来源可能会因实现方式而异。
  • 如果给定或检测到的时区ID未知,请使用GMT作为最后的手段。 从ID创建的默认TimeZone将被缓存,并返回其克隆。返回时将user.timezone属性值设置为ID。
,

就这么简单

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

public class Main {
    public static void main(String[] args) {
        // Local date
        LocalDate today = LocalDate.now();
        System.out.println(today);

        // Local time
        LocalTime now = LocalTime.now();
        System.out.println(now);

        // Local date and time
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);

        // Day of week
        DayOfWeek dayOfWeek = today.getDayOfWeek();
        System.out.println(dayOfWeek);
        System.out.println(dayOfWeek.getValue());
    }
}

我所在时区的输出:

2020-10-03
17:47:57.426833
2020-10-03T17:47:57.426943
SATURDAY
6