Java微服务对UTC时间格式的处理
一、背景
先说一下为什么要使用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时间格式的处理的更多相关文章
- Java微服务(二):服务消费者与提供者搭建
本文接着上一篇写的<Java微服务(一):dubbo-admin控制台的使用>,上篇文章介绍了docker,zookeeper环境的安装,并参考dubbo官网演示了dubbo-admin控 ...
- Java微服务(二):负载均衡、序列化、熔断
本文接着上一篇写的<Java微服务(二):服务消费者与提供者搭建>,上一篇文章主要讲述了消费者与服务者的搭建与简单的实现.其中重点需要注意配置文件中的几个坑. 本章节介绍一些零散的内容:服 ...
- 现如今,最热门的13个Java微服务框架
曾经的 服务器领域 有许多不同的芯片架构???有哪些芯片架构???和操作系统???,经过长期发展,Java的“一次编译,到处运行”使得它在服务器领域找到一席之地,成为程序员们的最爱. 本文,我们将和大 ...
- 多云架构下,JAVA微服务技术选型实例解析
[摘要] 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点. 微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. ...
- 从成本角度看Java微服务
近年来,微服务因其良好的灵活性和伸缩性等特点备受追捧,很多公司开始采用微服务架构或将已有的单体系统改造成微服务.IBM也于近日开源了轻量级Java微服务应用服务器 Open Liberty .但是采用 ...
- Java微服务框架一览
引言:本文首先简单介绍了微服务的概念以及使用微服务所能带来的优势,然后结合实例介绍了几个常见的Java微服务框架. 微服务在开发领域的应用越来越广泛,因为开发人员致力于创建更大.更复杂的应用程序,而这 ...
- Java微服务 vs Go微服务,究竟谁更强!?
前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...
- 精心整理Java微服务最全面试题集(含答案)
微服务架构相关 大型网站架构演变过程 网站架构演变演变过程 传统架构 → 分布式架构 → SOA架构 → 微服务架构 什么是分布式架构 分布式架构就是将传统结构按照模块进行拆分,不同的人负责不同的模块 ...
- 最热门的 10 个 Java 微服务框架
1.Spring Boot Java 构建 Spring 应用程序已经有很长一段时间了,Spring Boot 是 Spring 的一个特定版本,它通过对配置细节的处理,使微服务构建更加简便.创建 S ...
随机推荐
- devexpress entity framework 与 asp.net mvc的坑
最近在做一个使用ASP.NET MVC DEVEXPRESS和EF的OA模块 遇到不少问题这里记录一下: 1 如果项目中存在多个上下文类(DBContext的派生类),在做数据迁移的时候需要在不同目录 ...
- Arbiter 系统使用说明
Arbiter 系统使用说明 Overview Arbiter是NOI系列赛事的官方评测软件, 由北航的相关人员开发. 在OIer会经历的几场大型比赛中, 除了省选和PKUSC/THUSC不使用Arb ...
- Ajax疯狂讲义
Ajax: async javascript and xml 异步的JS和XML AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这 ...
- C语言_了解下结构体指针
在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型.当然也可以指向结构体,先看一个小案例: #include <stdio.h> #include <string.h&g ...
- CentOs下Mongodb的下载与安装
1.下载MongoDB(64位) http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz tar zxvf mongodb-lin ...
- Java.lang.Comparable接口和Java.util.Comparator接口的区别
Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...
- thinkpad E480 用户初体验
梦寐以求的E480终于到手了,经过几天使用之后,也该写一下用户体验了,也算是对这些天的调研的一个总结吧. 首先是外形,从外形上来看E480的外形的确是相对以前的塑料外壳,改进了不少,全金属的机身,磨砂 ...
- MAC地址表配置与绑定
MAC地址表分类 ---静态MAC地址表项由用户手工配置,表项不老化: ---黑洞MAC地址表项包括源黑洞MAC地址表项和目的黑洞MAC地址表项,用于丢弃含有特定源MAC地址或目的MAC地址的报文(例 ...
- jmeter 脚本规范
总结了一下公司正在用 jmeter 脚本规范. 使用 jmeter 进行接口级测试, 随着接口增多以及业务逻辑越来越复杂, 导致 jmeter 脚本的维护会更加困难.针对实际使用中发现的问题进行一些规 ...
- Node.js模块导出module.exports 和 exports,Es6模块导出export 和export default的区别
1.module.exports module变量代表当前模块.这个变量是一个对象,module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象: module.exports ...