一、背景

先说一下为什么要使用UTC时间。开发一个全球化的系统,服务端(Java微服务)集中部署在同一个地方,用户在全球通过浏览器、手机客户端访问。不同地区的时区是不一样的,同一个时间戳,不同的用户看到的是不同的时间。

对于服务端来讲,不应该去适配不同地方的不同时区。在Java服务后台及数据库中都应该使用唯一的UTC时间(一个long型的时间戳,单位是毫秒)。

直接使用使用这个数字串存在一些问题。无论是写日志,还是存储到数据库都不直观,可读性差遇到问题定位麻烦,最好还是转换为我们常用的yyyy-MM-dd HH:mm:ss格式,只是对应的时区是UTC。

UTC时区与中国大陆时区相比要早8个小时。为了转换方便,封装了如下一个公共类,方便UTC时间的各种转换。

二、公共类

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

 /**
  *
  * 日期处理公共类定义。
  *
  * @author elon
  * @version 2018-02-11
  */
 public class DateUtil {

     public DateUtil() {
     }

     /**
      * 定义UTC日期转换器。SimpleDateFormat不是线程安全的。
      */
     private static ThreadLocal<SimpleDateFormat> utcDateFormatter = new ThreadLocal<SimpleDateFormat>() {

         @Override
         protected SimpleDateFormat initialValue() {
             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             format.setTimeZone(TimeZone.getTimeZone("UTC"));
             return format;
         }
     };

     /**
      * 定义当前系统时间转换器。使用的时区为当前系统所在时区。
      */
     private static ThreadLocal<SimpleDateFormat> localDateFormatter = new ThreadLocal<SimpleDateFormat>() {

         @Override
         protected SimpleDateFormat initialValue() {
             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             return format;
         }
     };

     /**
      * 将UTC日期转换为字符串形式。方便日志文件记录。
      * @param date 日期
      * @return yyyy-MM-dd HH:mm:ss格式的字符串
      */
     public static String toUTCDateString(Date date) {
         return utcDateFormatter.get().format(date);
     }

     /**
      * 将UTC时间戳转换为字符串格式。
      *
      * @param timestamp 时间戳
      * @return yyyy-MM-dd HH:mm:ss格式的字符串
      */
     public static String timeStamp2UTCDateStr(long timestamp) {
         return toUTCDateString(new Date(timestamp));
     }

     /**
      * 获取当前utc时间
      *
      * @return yyyy-MM-dd HH:mm:ss格式的utc时间字符串
      */
     public static String getCurrentUTC() {

         // Date本身是没有时区概念的.转换为字符串的过程中涉及时区信息。
         return toUTCDateString(new Date());
     }

     /**
      * 将日期转换为本地时间字符串。
      * @param date 日期对象
      * @return 字符串
      */
     public static String toLocalDateStr(Date date) {
         return localDateFormatter.get().format(date);
     }

     /**
      * 解析utc时间字符串,转换为Date对象
      * @param utcDateStr utc时间字符串,格式为:yyyy-MM-dd HH:mm:ss
      * @return Date
      * @throws ParseException 解析异常
      */
     public static Date toUTCDate(String utcDateStr) throws ParseException {
         return utcDateFormatter.get().parse(utcDateStr);
     }
 }

Java微服务对UTC时间格式的处理的更多相关文章

  1. Java微服务(二):服务消费者与提供者搭建

    本文接着上一篇写的<Java微服务(一):dubbo-admin控制台的使用>,上篇文章介绍了docker,zookeeper环境的安装,并参考dubbo官网演示了dubbo-admin控 ...

  2. Java微服务(二):负载均衡、序列化、熔断

    本文接着上一篇写的<Java微服务(二):服务消费者与提供者搭建>,上一篇文章主要讲述了消费者与服务者的搭建与简单的实现.其中重点需要注意配置文件中的几个坑. 本章节介绍一些零散的内容:服 ...

  3. 现如今,最热门的13个Java微服务框架

    曾经的 服务器领域 有许多不同的芯片架构???有哪些芯片架构???和操作系统???,经过长期发展,Java的“一次编译,到处运行”使得它在服务器领域找到一席之地,成为程序员们的最爱. 本文,我们将和大 ...

  4. 多云架构下,JAVA微服务技术选型实例解析

    [摘要] 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点. 微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. ...

  5. 从成本角度看Java微服务

    近年来,微服务因其良好的灵活性和伸缩性等特点备受追捧,很多公司开始采用微服务架构或将已有的单体系统改造成微服务.IBM也于近日开源了轻量级Java微服务应用服务器 Open Liberty .但是采用 ...

  6. Java微服务框架一览

    引言:本文首先简单介绍了微服务的概念以及使用微服务所能带来的优势,然后结合实例介绍了几个常见的Java微服务框架. 微服务在开发领域的应用越来越广泛,因为开发人员致力于创建更大.更复杂的应用程序,而这 ...

  7. Java微服务 vs Go微服务,究竟谁更强!?

    前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...

  8. 精心整理Java微服务最全面试题集(含答案)

    微服务架构相关 大型网站架构演变过程 网站架构演变演变过程 传统架构 → 分布式架构 → SOA架构 → 微服务架构 什么是分布式架构 分布式架构就是将传统结构按照模块进行拆分,不同的人负责不同的模块 ...

  9. 最热门的 10 个 Java 微服务框架

    1.Spring Boot Java 构建 Spring 应用程序已经有很长一段时间了,Spring Boot 是 Spring 的一个特定版本,它通过对配置细节的处理,使微服务构建更加简便.创建 S ...

随机推荐

  1. devexpress entity framework 与 asp.net mvc的坑

    最近在做一个使用ASP.NET MVC DEVEXPRESS和EF的OA模块 遇到不少问题这里记录一下: 1 如果项目中存在多个上下文类(DBContext的派生类),在做数据迁移的时候需要在不同目录 ...

  2. jquery序列化serialize()方法空格变为+问题解决参考方法

    $("#sendNoticeData-form").serialize();会在value中存在空格的地方转化为+符合.比如:name:tiwax aaa序列化后为tiwax+aa ...

  3. 剑指offer第八天

    32.把数组排成最小的数 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323 ...

  4. HDU - 3567 Eight II (bfs预处理 + 康托) [kuangbin带你飞]专题二

    类似HDU1430,不过本题需要枚举X的九个位置,分别保存状态,因为要保证最少步数.要保证字典序最小的话,在扩展节点时,方向顺序为:down, left, right, up. 我用c++提交1500 ...

  5. POJ - 1321 dfs [kuangbin带你飞]专题一

    枚举行和列即可,当前已经放下cnt个棋子,当前已经搜索到第r行,如果 n - r + cnt  < k 直接退出,因为后面无法放下剩下的棋子. AC代码 #include<cstdio&g ...

  6. R语言数据框中,用0替代NA缺失值

    1.用0替代数据框中的缺失值NA 生成数据框: > m <- matrix(sample(c(NA, :), , replace = TRUE), ) > d <- as.da ...

  7. Centos中hive/hbase/hadoop/mysql实际操作及问题总结

    目录 Hive中文乱码问题 hive和hbase的版本不一致 Ambari hive插入Hbase出错 Hive0.12和Hbase0.96不兼容,重新编译hive0.12.0 hiveserver不 ...

  8. 快速排序(QuickSort)

    1.算法思想    快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原 ...

  9. 用DDK开发的9054驱动 .

    和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...

  10. [javascript]一段焦点图的js代码

    <html> <head> <meta name="name" content="content"charset="ut ...