几种日期时区转换方式
常用的时区转换有如下几种方式
方式一
转换原理
通过DateFormat 的format方法
代码示例
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;public class TimeZoneUtil {public static void main(String[] args) throws ParseException {//要转换的字符串时间String sourceDateStr = "2023-04-02 11:00:00";//源时区String sourceTimeZoneCode = "Europe/Amsterdam";//目标时区String targetTimeZoneCode = "Asia/Shanghai";//转换时区convertTimezone(sourceDateStr,sourceTimeZoneCode,targetTimeZoneCode);}//转换时区private static void convertTimezone(String sourceDateStr,String sourceTimeZoneCode,String targetTimeZoneCode) throws ParseException {//获取源时区的DateFormatDateFormat sourceDateFormat = getDateFormat("yyyy-MM-dd HH:mm:ss", sourceTimeZoneCode);//获取目标时区的DateFormatDateFormat targetDateFormat = getDateFormat("yyyy-MM-dd HH:mm:ss", targetTimeZoneCode);//设置要转换的时间(时区为源时区)Date sourceDate = sourceDateFormat.parse(sourceDateStr);//通过format方法转为目标时区String targetDateStr = targetDateFormat.format(sourceDate);System.out.println("转换后:" + targetDateStr);}//获取对应时区的DateFormatpublic static DateFormat getDateFormat(String pattern, String timeZoneCode){DateFormat sdf = new SimpleDateFormat(pattern);TimeZone timeZone = TimeZone.getTimeZone(timeZoneCode);//根据时区code获取时区对象sdf.setTimeZone(timeZone);//设置时区return sdf;}
}
扩展
1 获取系统时区(也叫本地时区)
示例值:“Europe/Amsterdam”、 “Asia/Shanghai”
String sysZoneId = TimeZone.getDefault().getID();
方式二
转换原理
通过 ZonedDateTime.ofInstant方法
代码示例
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.TimeZone;public class TimeZoneUtil2 {public static void main(String[] args) throws ParseException {//要转换的字符串时间String sourceDateStr = "2023-04-02 11:00:00";//源时区String sourceTimeZoneCode = "Europe/Amsterdam";//目标时区String targetTimeZoneCode = "Asia/Shanghai";//转换时区convertTimezone(sourceDateStr,sourceTimeZoneCode,targetTimeZoneCode);}//转换时区private static void convertTimezone(String sourceDateStr,String sourceTimeZoneCode,String targetTimeZoneCode) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//获取源时区的DateFormatDateFormat sourceDateFormat = getDateFormat("yyyy-MM-dd HH:mm:ss", sourceTimeZoneCode);//设置要转换的时间(时区为源时区)Date sourceDate = sourceDateFormat.parse(sourceDateStr);//转换ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(sourceDate.toInstant(), TimeZone.getTimeZone(targetTimeZoneCode).toZoneId());//ZonedDateTime转DateInstant instant = zonedDateTime.toInstant();Date date = Date.from(instant);System.out.println("转换后:" + sdf.format(date));}public static DateFormat getDateFormat(String pattern, String timeZoneCode){SimpleDateFormat sdf = new SimpleDateFormat(pattern);TimeZone timeZone = TimeZone.getTimeZone(timeZoneCode);//根据时区code获取时区对象sdf.setTimeZone(timeZone);//设置时区return sdf;}
}
方式三
转换原理
通过时区偏移量转换
时区偏移量 ZoneOffset
每一个时区间隔是一个小时,所以偏移量就是60*60=3600,换做毫秒就是3600000
比如:
东一区跟0时区相差1小时,它的偏移量就是36000001=3600000
东八区跟0时区相差8小时,它的偏移量就是36000008=28800000
代码示例
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;public class TimeZoneUtil3 {public static void main(String[] args) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置要转换的时间String sourceTimeStr = "2023-04-02 11:00:00";Date sourceDate = sdf.parse(sourceTimeStr);//源时区String sourceTimeZoneCode = "Europe/Amsterdam";//目标时区String targetTimeZoneCode = "Asia/Shanghai";//转换时区convertTimezone(sourceDate,sourceTimeZoneCode,targetTimeZoneCode);}//转换时区private static void convertTimezone(Date sourceDate,String sourceTimeZoneCode,String targetTimeZoneCode) {//获取源时间毫秒值long sourceTimeMillis = sourceDate.getTime();//构造源时区CalendarCalendar sourceCalendar = Calendar.getInstance();sourceCalendar.setTimeInMillis(sourceTimeMillis);//设置时间sourceCalendar.setTimeZone(TimeZone.getTimeZone(sourceTimeZoneCode));//设置源时区//获取 源时区 到 UTC 的时区偏移量int sourceZoneOffset = sourceCalendar.get(Calendar.ZONE_OFFSET);//获取源时区的夏令时偏移量(如果做国际系统就要考虑这个)int sourceDaylightOffset = sourceCalendar.get(Calendar.DST_OFFSET);//构造目标时区CalendarCalendar targetCalendar = Calendar.getInstance();targetCalendar.setTimeInMillis(sourceTimeMillis);//设置时间targetCalendar.setTimeZone(TimeZone.getTimeZone(targetTimeZoneCode));//设置目标时区//获取 目标时区 到 UTC 的时区偏移量int targetZoneOffset = targetCalendar.get(Calendar.ZONE_OFFSET);//获取目标时区的夏令时偏移量(如果做国际系统就要考虑这个)int targetDaylightOffset = targetCalendar.get(Calendar.DST_OFFSET);//计算 源时区 和 目标时区 的偏移量差值int offset = (targetZoneOffset + targetDaylightOffset) - (sourceZoneOffset + sourceDaylightOffset);long targetTimeMillis = sourceTimeMillis + offset;System.out.println("转换后:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(targetTimeMillis)));}
}
几种日期时区转换方式相关推荐
- icc 颜色 c语言,浅析颜色在icc中四种不同的转换方式
在我们使用频率最高的图像处理软件Photoshop中,我们可以在颜色设置项中的转换选项中发现"意图"一项中有可感知.饱和度.相对比色和绝对比色四个选项,这是不同颜色在icc之间转换 ...
- 【101】Convertio-百种存储格式在线转换工具
好久不见,甚是想念,春节后"ONET一站"恢复更新啦,尽量做到每日一更,偶尔一鸽~ 今天分享一个硬核在线工具,Convertio.我们在网上经常会遇到各种格式的文件,比如epub格 ...
- jpg怎么转换成png格式?四种转换方式试试看
很多时候,我们需要将JPG(Joint Photographic Experts Group)格式转换成PNG(Portable Network Graphics)格式,从而便于图片的使用.那么,将J ...
- 时间格式的处理方法总结以及时间格式和时间戳之间的转换方式,以及如何计算日期相差的天数
1.Date() --返回此刻的日期和时间. "Wed Aug 21 2019 10:07:20 GMT+0800 (中国标准时间)" 2.getDate() --从 Date 对 ...
- java方法转换大写日期及人民币大写转换方式 .txt
java方法转换大写日期及人民币大写转换方式 2012-03-02 14:38:03| 分类: java |字号 订阅 /** * 阿拉伯数字与中文数字(大小写)之间的转换 * */ import j ...
- java将日期格式转大写_java方法转换大写日期及人民币大写转换方式 .txt
java方法转换大写日期及人民币大写转换方式 2012-03-02 14:38:03| 分类: java |字号 订阅 /** * 阿拉伯数字与中文数字(大小写)之间的转换 * */ import j ...
- 日期和时间戳转换方式
将日期转换成时间戳(例如:北京时间2021-12-02 08:00:00) 1.利用网上的时间戳在线转换工具 https://tool.lu/timestamp/ 2.利用postgresql的函数转 ...
- Json对象与Json字符串互转(4种转换方式)
Json字符与Json对象的相互转换方式有很多种: 1. jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以 ...
- js中Json对象与Json字符串互转(4种转换方式)
1>jQuery插件支持的转换方式: 复制代码代码如下: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成jso ...
最新文章
- Jdk11,Jdk12的低延迟垃圾收集器ZGC
- 2019年度苏州之春摄影作品展
- C++ STL库的总结以及实现原理
- Spring MVC工作原理 及注解说明
- MYSQL 当有两条重复数据时 保留一条
- hibernate缓存详解
- 浙大 PAT b1017
- Linux IO控制命令生成
- 从Word2Vec到Bert,聊聊词向量的前世今生(一)
- mtk无线网卡 linux,在树莓派上使用基于MT7601的无线网卡(如360/百度/腾讯Wifi)
- matlab gui伪色彩增强,基于Matlab GUI的医学灰度图像伪彩色增强判读系统
- 八月十一上午笔记钊哥第一节课
- 《东藏记》—— 读后总结
- cisco 2960交换机密码恢复教程
- word批注怎么删除计算机名字,【2人回答】Word批注中的名字怎么删除?-3D溜溜网...
- MFC 执行顺序总结
- 奋斗吧之“和loser对话”小故事
- EXCEL VLOOKUP用中文匹配出错
- SSM 实战项目遇到的问题
- VMware虚拟机超简单的联网方法
热门文章
- 从“非主流”到“潮流”,开源早已值得拥有
- 禁止wordpress自动生成多尺寸的图片
- 写了一个网站:12小时福利区
- window11中QQ登录“无法访问个人文件夹”解决方案
- 自学实前后端践项目3 Spring Cloud微服务 2
- 572 另一棵树的子树
- Centos下使用yum安装Mysql8(Mysql5.7)以及常见的配置和使用
- 浩方登录不上服务器无响应,sv独立客户端无法登陆服务器(sv独立客户端连接失败)...
- Windows命令-wmic
- “高质高效嵌入式软件开发”的企业内训开始