问题描述
我需要找出一种可靠地获取用户本地时间的方法。经过研究,一种可能的解决方案可能是:
用户所在位置的星期几:
int dayOfWeek = zoneddatetime.Now(Clock.systemDefaultZone()).getDayOfWeek().ordinal();
用户所在位置的实际时间:
LocalDateTime.Now(Clock.systemDefaultZone()));
这一切正确吗?我是否正确使用Clock.systemDefaultZone()
?如果是这样,我想知道Clock.systemDefaultZone()
如何能够神奇地找出正确的时区?
解决方法
请注意,在第一个示例中,您不需要ZonedDateTime
,LocalDate
就可以了,因为您只关心星期几,而不关心那一天的时间。另外请注意,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