常用的时区转换有如下几种方式

方式一

转换原理

通过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小时,它的偏移量就是3600000
8=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)));}
}

几种日期时区转换方式相关推荐

  1. icc 颜色 c语言,浅析颜色在icc中四种不同的转换方式

    在我们使用频率最高的图像处理软件Photoshop中,我们可以在颜色设置项中的转换选项中发现"意图"一项中有可感知.饱和度.相对比色和绝对比色四个选项,这是不同颜色在icc之间转换 ...

  2. 【101】Convertio-百种存储格式在线转换工具

    好久不见,甚是想念,春节后"ONET一站"恢复更新啦,尽量做到每日一更,偶尔一鸽~ 今天分享一个硬核在线工具,Convertio.我们在网上经常会遇到各种格式的文件,比如epub格 ...

  3. jpg怎么转换成png格式?四种转换方式试试看

    很多时候,我们需要将JPG(Joint Photographic Experts Group)格式转换成PNG(Portable Network Graphics)格式,从而便于图片的使用.那么,将J ...

  4. 时间格式的处理方法总结以及时间格式和时间戳之间的转换方式,以及如何计算日期相差的天数

    1.Date() --返回此刻的日期和时间. "Wed Aug 21 2019 10:07:20 GMT+0800 (中国标准时间)" 2.getDate() --从 Date 对 ...

  5. java方法转换大写日期及人民币大写转换方式 .txt

    java方法转换大写日期及人民币大写转换方式 2012-03-02 14:38:03| 分类: java |字号 订阅 /** * 阿拉伯数字与中文数字(大小写)之间的转换 * */ import j ...

  6. java将日期格式转大写_java方法转换大写日期及人民币大写转换方式 .txt

    java方法转换大写日期及人民币大写转换方式 2012-03-02 14:38:03| 分类: java |字号 订阅 /** * 阿拉伯数字与中文数字(大小写)之间的转换 * */ import j ...

  7. 日期和时间戳转换方式

    将日期转换成时间戳(例如:北京时间2021-12-02 08:00:00) 1.利用网上的时间戳在线转换工具 https://tool.lu/timestamp/ 2.利用postgresql的函数转 ...

  8. Json对象与Json字符串互转(4种转换方式)

    Json字符与Json对象的相互转换方式有很多种: 1. jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以 ...

  9. js中Json对象与Json字符串互转(4种转换方式)

    1>jQuery插件支持的转换方式: 复制代码代码如下: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成jso ...

最新文章

  1. Jdk11,Jdk12的低延迟垃圾收集器ZGC
  2. 2019年度苏州之春摄影作品展
  3. C++ STL库的总结以及实现原理
  4. Spring MVC工作原理 及注解说明
  5. MYSQL 当有两条重复数据时 保留一条
  6. hibernate缓存详解
  7. 浙大 PAT b1017
  8. Linux IO控制命令生成
  9. 从Word2Vec到Bert,聊聊词向量的前世今生(一)
  10. mtk无线网卡 linux,在树莓派上使用基于MT7601的无线网卡(如360/百度/腾讯Wifi)
  11. matlab gui伪色彩增强,基于Matlab GUI的医学灰度图像伪彩色增强判读系统
  12. 八月十一上午笔记钊哥第一节课
  13. 《东藏记》—— 读后总结
  14. cisco 2960交换机密码恢复教程
  15. word批注怎么删除计算机名字,【2人回答】Word批注中的名字怎么删除?-3D溜溜网...
  16. MFC 执行顺序总结
  17. 奋斗吧之“和loser对话”小故事
  18. EXCEL VLOOKUP用中文匹配出错
  19. SSM 实战项目遇到的问题
  20. VMware虚拟机超简单的联网方法

热门文章

  1. 从“非主流”到“潮流”,开源早已值得拥有
  2. 禁止wordpress自动生成多尺寸的图片
  3. 写了一个网站:12小时福利区
  4. window11中QQ登录“无法访问个人文件夹”解决方案
  5. 自学实前后端践项目3 Spring Cloud微服务 2
  6. 572 另一棵树的子树
  7. Centos下使用yum安装Mysql8(Mysql5.7)以及常见的配置和使用
  8. 浩方登录不上服务器无响应,sv独立客户端无法登陆服务器(sv独立客户端连接失败)...
  9. Windows命令-wmic
  10. “高质高效嵌入式软件开发”的企业内训开始