在程序开发中会因为时区的不同,会发生时间类型的数据出现问题。记录@JsonFormat 注解在使用过程中应该注意的问题。


时区概述

GMT:Greenwich Mean Time 格林尼治标准时间。这是以英国格林尼治天文台观测结果得出的时间,这是英国格林尼治当地时间,这个地方的当地时间过去被当成世界标准的时间。

UT:Universal Time 世界时。根据原子钟计算出来的时间。

UTC:Coordinated Universal Time 协调世界时。因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年协调世界时组织都会给世界时+1秒,让基于原子钟的世界时和基于天文学(人类感知)的格林尼治标准时间相差不至于太大。并将得到的时间称为UTC,这是现在使用的世界标准时间。

协调世界时不与任何地区位置相关,也不代表此刻某地的时间,所以在说明某地时间时要加上时区

也就是说GMT并不等于UTC,而是等于UTC+0,只是格林尼治刚好在0时区上。

GMT = UTC+0


中国的默认时区

中国的默认时区是东八区
在这里插入图片描述


TimeZone获得本地时区

实现代码

package cn.wideth.util;

import java.util.TimeZone;

public class Main {

    public static void main(String[] args) {

        //获得当前的默认时区
        TimeZone timeZone = TimeZone.getDefault();
        System.out.println(timeZone);
    }

}

运行结果
在这里插入图片描述


格林尼治时间(GMT)、世界协调时间(UTC)和中国时间的关系

中国时间(Asia/Shanghai) = 格林尼治时间(GMT) + 8
格林尼治时间(GMT) = 世界协调时间(UTC) + 0

package cn.wideth.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class TimeZoneTest {

    public static void main(String[] args) {

        //中国的默认时区,东八区,默认为Asia/Shanghai
        TimeZone tz = TimeZone.getDefault();
        System.out.println(tz.getID());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        TimeZone timeZone = TimeZone.getTimeZone(tz.getID());
        simpleDateFormat.setTimeZone(timeZone);
        System.out.println(simpleDateFormat.format(new Date()));
        //东八区的时间 = 格林尼治时间 + 8
        TimeZone timeZone2 = TimeZone.getTimeZone("GMT+8");
        simpleDateFormat.setTimeZone(timeZone2);
        System.out.println(simpleDateFormat.format(new Date()));
        System.out.println("-------------------------------------");
        //格林尼治时间(GMT)。GMT = UTC+0
        TimeZone timeZone3 = TimeZone.getTimeZone("GMT");
        simpleDateFormat.setTimeZone(timeZone3);
        System.out.println(simpleDateFormat.format(new Date()));
        //世界协调时间(UTC),世界标准时间(美国时间)
        TimeZone timeZone4 = TimeZone.getTimeZone("UTC");
        simpleDateFormat.setTimeZone(timeZone4);
        System.out.println(simpleDateFormat.format(new Date()));
    }
}

运行结果

在这里插入图片描述


Locale获得每个国家的语言简称

package cn.wideth.util;

import java.util.Locale;
/**
 * java来获得全球国家
 * 名称,语言和简称
 */
public class LocaleTest {

    public static void main(String[] args) {

        //获得中国的简称,默认为语言简称
        Locale l = Locale.getDefault();
        Locale[] locales = Locale.getAvailableLocales();
        for(int i = 0, len = locales.length; i < len; i++){

            StringBuffer sb = new StringBuffer();
            sb.append("中文名称:").append(locales[i].getDisplayCountry()).append(" -- 简称:").
                    append(locales[i].getCountry()).append(" -- 语言简称:").append(locales[i].toString());
            System.out.println(sb.toString());
        }
    }
}

运行结果

在这里插入图片描述


@JsonFormat注解用法

@JsonFormat 用来表示json序列化的一种格式或者类型,主要有下面几个常用的属性

   @JsonFormat(shape = JsonFormat.Shape.ANY,locale = "zh_CN",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT")
    private  Date date;

shap: 表示序列化后的一种类型,默认为JsonFormat.Shape.ANY

pattern: 表示日期的格式,默认为序列化以后的格式,比如:2020-09-08T15:19:09.000+00:00

timezone: 默认是GMT,中国需要GMT+8

locale: 根据位置序列化的一种格式,默认为本地的语言简称,中国的语言简称为zh_CN

注意:@JsonFormat注解默认的时区为格林尼治时间,比中国时间(东八区是要小8个小时的)。


程序中数据库时区的设置

在这里插入图片描述


本文小结

本文首先介绍了时区,中国时区,即东八区。格林尼治时间,世界协调时间。最后介绍了@JsonFormat注解的使用和用法,以及在使用过程中需要注意到的问题。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐