全球根据纬度不同,划分不同的时区。对于此时此刻,大家同处同一个时间点,但是,每个时区的时间表示是不同的。Java可以使用 System.currentTimeMillis LocalDateTime 相关代码获取当前时区时间。

System.currentTimeMillis

  • 获取当前毫秒数,与时区无关,我们Java的 new Date() 方法,也是通过它创建当前时间实例。
  • 获得的是自1970-01-01 00:00:00.000到当前时刻的时间距离,类型为long
  • 获取的毫秒数是系统当前时区的 1970-01-01 00:00:00.000 以来的毫秒数,如果使用的是linux系统默认时区(0),则对于我国的+8时区刚好差8小时毫秒数
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.TimeZone;
public class Test2 {
    public static void main(String[] args) {
        String os = System.getProperty("os.name");
        TimeZone zone = TimeZone.getDefault();
        System.out.println("zone = " + zone.getID() + ", os = " + os);
		long time1 = System.currentTimeMillis();
        LocalDateTime local = LocalDateTime.now();
		long time2 = local.toInstant(ZoneOffset.UTC).toEpochMilli();
		TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
		long time3 = calendar.getTime().getTime() + 8 * 60 * 60 * 1000;	
		System.out.println("time1 = " + time1);
		System.out.println("time2 = " + time2);
		System.out.println("time3 = " + time3);
zone = Asia/Shanghai, os = Windows 10
time1 = 1662279837186
time2 = 1662308637222
time3 = 1662308637235

LocalDateTime

  • LocalDateTime 本身不包含时区信息,它存储了年、月、日、小时、分钟、秒和纳秒等数字。
  • LocalDateTime 默认只是存储当前系统所在时区当前时刻的年月日时分秒的数字
  • LocalDateTime.now 可以在传递参数时指定时区
  • toInstant()可以指定时区生成毫秒数(这里指定国际时间 UTC 0,实际上就是 System.currentTimeMillis() + 时区偏移毫秒数)
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.TimeZone;
public class Test3 {
    public static void main(String[] args) {
        String os = System.getProperty("os.name");
        TimeZone zone = TimeZone.getDefault();
        System.out.println("zone = " + zone.getID() + ", os = " + os);
		long time1 = System.currentTimeMillis();
		// LocalDateTime itself does not contain time zone information, it stores numbers such as year, month, day, hour, minute, second, and nanosecond.
        LocalDateTime local = LocalDateTime.now();
		System.out.println("local = " + local);
		long time2 = local.toInstant(ZoneOffset.UTC).toEpochMilli();
		// LocalDateTime.now can specify the time zone when passing the parameter
		LocalDateTime dtUtc = LocalDateTime.now(ZoneOffset.UTC);	
		System.out.println("dtUtc = " + dtUtc);
        long time3 = dtUtc.toInstant(ZoneOffset.UTC).toEpochMilli();
		Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
		long time4 = calendar.getTime().getTime() ;//+ 8 * 60 * 60 * 1000;	
		System.out.println("time1 = " + time1);
		System.out.println("time2 = " + time2);
		System.out.println("time3 = " + time3);
		System.out.println("time4 = " + time3);
zone = Asia/Shanghai, os = Windows 10
local = 2022-09-04T16:25:27.030469500
dtUtc = 2022-09-04T08:25:27.031493500
time1 = 1662279926996
time2 = 1662308727030
time3 = 1662279927031
time4 = 1662279927031
  • 其实只要服务器设置的时区是正确的,无论LocalDateTime.now()还是System.currentTimeMillis()都是正确的,都没有问题
  • 如果时区不正确,就要考虑针对时区处理下8小时毫秒数差距
  • 下面使用LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()获取当前毫秒数,再获取系统时区,判断是否为Asia/Shanghai,若不是(linux默认0时区),则加8小时毫秒数(8 * 60 * 60 * 1000
                // LocalDateTime 本身不包含时区信息(只是当前系统所在时区当前时刻的年月日时分秒)
                // toInstant可以指定时区生成毫秒数(这里指定国际时间 UTC 0,实际上就是 System.currentTimeMillis() + 时区偏移毫秒数)
                long time = LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli();
                TimeZone zone = TimeZone.getDefault();
                // 东八区为北京/上海时间,国内一般使用 UTC +8(但是linux服务器、docker初始都是 UTC 0)
                if (!"Asia/Shanghai".equals(zone.getID())) {
                    time += 8 * 60 * 60 * 1000;
                System.out.println("当前zone为:" + zone + ", 当前时间为:" + time);
                                    Java 获得时区相关的类,主要是ZoneId,还有TimeZone(这个信息详细一点)
ZoneId 主要是通过列表选定了一些规定位置,然后通过这些位置代表的时区,来划分时区,例如 中国就是Asia/Shanghai
然后根据时区,我们可以根据 ZoneId ,来创建TimeZone 对象,再有 TimeZone 对象 来创建Calendar 对象
测试代码如下:
package te...
                                    在开发时我们经常需要获取当前时间或者对时间进项处理(在某个时间的基础上增加或者减少),java获取时间的方法比较多,有LocalDateTime、Date、Calendar等,其中LocalDateTimejava8的新特性,相比较其它两个而言,LocalDateTime有很多优势,这也是最推荐使用的方法。下面我们先来介绍一个LocalDateTime的用法,然后介绍Date、Calendar的用法,最后比较它们的区别。
                                    Java 可以通过 Timezone 获取时区,但是通过 Timezone 获取时区JVM 初始化时保存的时区,并不是操作系统所设置的时区。当修改过操作系统的时区后,JVM 并不会同步更新。Timezone 获取时区的代码如下:// 获取 JVM 启动时获取时区TimeZone.getDefault();// 获取任意指定区域的时区String[] zoneIDs = TimeZone.g...
                                    如何使用Java获取时区当前日期和时间?我的应用托管在伦敦服务器中。 我在西班牙马德里。 因此,时区为-2小时。如何获取带有时区当前日期/时间。Date curr_date = new Date(System.currentTimeMillis());例如Date curr_date = new Date(System.currentTimeMillis("MAD_TIMEZONE"));与J...
然后想在获取到当地的时间,把获取到的时区传给下面这个方法里面
function getLocalTime(timezone) {
      if (typeof timezone !== "number") {
        return new Date();
      var d = new Date();
      var len = 
                                    1.  TimeZone.getDefault()
TimeZone timeZone = TimeZone.getDefault();
System.out.println(timeZone.getDisplayName());
System.out.println(timeZone.getID());
// 中国标准时间
// Asia/Shanghai
2.  System.getProperty(“user.timezone”)
String property = System.getProper
                                    Instant获取的是格林威治标准时间(UTC时间)。因为Instant是表示时间戳的对象,它不依赖于时区信息。但是在显示Instant对象时,需要将其转换为特定时区的本地时间。但是此修改可能是全局性的,建议在代码启动之初设定全部使用同一时区时间,后面就不再频繁更改,避免产生时间错乱问题。java中如何获取utc时间,并转为Date对象,这是一个常见的问题。获取了UTC的毫秒时间,然后new一个Date对象。那么为什么不能获取,如何正确获取utc时间呢?时打印的是带时区时间,而非UTC时间。
                                    这里写自定义目录标题主要内容包括一 、先主要是Java8中LocalDate日期的操作1. Date转LocalDate、LocalDateTime2. 13位long类型转LocalDate3. 获取现在的日期4. 获取年月日5. 判断两个日期之间相差多少天6. 获得某个日期所在月的第一天、最后一天7. 某个月有多少天8. 比较两个LocalDate的大小9. 获取下一周的该星期、下个月的这天、下个月的1号10. 比较两个LocalDate相差多少年、月、天11. 通过10位或13位时间戳构建Instan
                                    Java 可以通过 Timezone 获取时区,但是通过 Timezone 获取时区JVM 初始化时保存的时区,并不是操作系统所设置的时区。当修改过操作系统的时区后,JVM 并不会同步更新。Timezone 获取时区的代码如下:
// 获取 JVM 启动时获取时区
TimeZone.getDefault();
// 获取任意指定区域的时区
String[] zoneID...