一、背景

先说一下为什么要使用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);
     }
 }

最新文章

  1. 关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
  2. jquery 巧用json传参
  3. A Simple Problem with Integers_树状数组
  4. Java开发第一步:JDK 7 安装及配置
  5. poj 1804 (nyoj 117)Brainman : 归并排序求逆序数
  6. iOS开发--动画(Animation)总结
  7. 继承在WCF中的问题和解决办法
  8. android 常用调用系统功能
  9. Protel99Se使用方法详解
  10. Windows PowerShell 简介
  11. Android系统--输入系统(十五)实战_使用GlobalKey一键启动程序
  12. JAVA基础复习与总结&lt;十&gt; Ruannable和Callable
  13. linux中的shell脚本编程---初识shell
  14. flask狗书
  15. jenkins-参数化构建(二)插件:Extended Choice Parameter
  16. hadoop 动态调整mapred参数
  17. tp5 Excel导入
  18. 云存储的未来:Scale Up还是Scale Out?
  19. 02: flask 使用举例
  20. Redis 穿透和雪崩

热门文章

  1. nxlog4go 按天或按文件大小分割日志
  2. try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?
  3. R学习笔记:了解R的使用
  4. MySQL的BlackHole引擎在主从架构中的作用
  5. RegexKitLite编译报错
  6. 【开源】C#.NET股票历史数据采集,【附18年历史数据和源代码】
  7. 从零开始学习前端JAVASCRIPT — 14、闭包与继承
  8. C#实现二分法查找算法
  9. ORACLE中修改表的Schema的总结
  10. Tomcat启动过程源码解读