时间加减

Date currentDate = new Date(System.currentTimeMillis());

Calendar cal = Calendar.getInstance();

cal.setTime(currentDate);

cal.add(Calendar.DAY_OF_MONTH, -1);//减一天时间

startTime=outputFormat.format(cal.getTime());

开发跨地域的程序时,常需要进行时区转换,一个设计优良的系统,也必须考虑对多时区的支持。JDK提供了很多方便的机制和工具,来帮助我们解决时区转换问题。

解决跨时区问题的关键在于时间的记录形式。若将时间单纯的记录成“2011-05-14 23:30:00”,其中蕴含的信息并不足以进行时区转换,因为无法获知这是中国的23点30,还是美国的23点30,更不用说复杂的夏令时问题了。

我们可以使用一个long类型的变量来记录时间,该变量的值等于从1970年1月1日 00:00:00 GMT到记录时间点以来的毫秒数,其中GMT代表格林威治标准时间,通过这个差值,可以获得记录时间点的格林威治(零时区)时间,进而能方便的转换成全世界各时区的时间。(很多数据库引擎就是如此处理时间类型数据)

在Java中,有两个常用方法来获取以上描述的值:

System.currentTimeMillis(),该方法的返回值是从1970年1月1日 00:00:00 GMT至当前时间点以来的毫秒数,通常被用来获取当前系统时间;

java.util.Date的getTime(),该方法的返回值是从1970年1月1日 00:00:00 GMT至Date对象所表示的时间点以来的毫秒数,通常被用来获取特定的时间。

此外,我们还需要借助java.util.TimeZone类,来获取特定的时区,JRE安装目录下的\lib\zi文件夹列出了所有TimeZoneID,如:Asia/Shanghai。最后,使用java.text.SimpleDateFormat类提供的方法进行转换,并格式化输出。

//1. 将系统当前时间转换成美国东部时间

// America/Los_Angeles 洛杉矶时间

TimeZone timeZoneNY = TimeZone.getTimeZone("America/New_York");

SimpleDateFormat outputFormat = new SimpleDateFormat("EEE MMM d HH:mm:ss Z yyyy", Locale.US);

outputFormat.setTimeZone(timeZoneNY);

Date date = new Date(System.currentTimeMillis());

System.out.println(outputFormat.format(date));

//2. 将一个以字符串形式输入的北京时间转换成美国东部时间

String inputDate = "2011-05-14 23:30:00";

TimeZone timeZoneSH = TimeZone.getTimeZone("Asia/Shanghai");

TimeZone timeZoneNY = TimeZone.getTimeZone("America/New_York");

SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

inputFormat.setTimeZone(timeZoneSH);

Date date = null;

try

{

date = inputFormat.parse(inputDate);

}

catch (ParseException e)

{

}

SimpleDateFormat outputFormat = new SimpleDateFormat("EEE MMM d HH:mm:ss Z yyyy", Locale.US);

outputFormat.setTimeZone(timeZoneSH);

System.out.println("Asia/Shanghai:" + outputFormat.format(date));

outputFormat.setTimeZone(timeZoneNY);

System.out.println("America/New_York:" + outputFormat.format(date));

那么,夏令时(DST)的问题怎么解决呢?令人高兴的是,JDK(or JRE)已自动为我们进行了夏令时处理。可以做个试验,来验证以上第2段代码能适用于夏令时转换。美国在2011年开始和结束夏令时的时间是:3.13 2AM和11.6 2AM。

将输入时间inputDate设置为"2011-03-13 14:59:59",输出: Asia/Shanghai:Sun Mar 13 14:59:59 +0800 2011 America/New_York:Sun Mar 13 01:59:59 -0500 2011 此时,美国东部时间还差1秒进入夏令时,与北京时间相差13小时。

将输入时间inputDate设置为"2011-03-13 15:00:00",输出: Asia/Shanghai:Sun Mar 13 15:00:00 +0800 2011 America/New_York:Sun Mar 13 03:00:00 -0400 2011 此时,美国东部时间刚好进入夏令时,与北京时间相差12小时,同时,所使用的时区也发生了变化。

结束夏令时的试验就不再赘述了。

JDK(or JRE)之所以能自动的进行DST处理,是因为其已内置了各个国家的夏令时政策,并提供Timezone Updater Tool来保持低版本JDK(or JRE)的TimeZone更新,但SUN官方推荐使用JDK(or JRE)的更新来更新TimeZone信息。

综上,我们应尽量在系统中使用如上描述的long类型变量来记录时间,借助相应的方法,可方便的格式化为不同时区的时间进行显示。

Java中输出时区的缩写_Java中的时区转换小结相关推荐

  1. java中输出时 什么作用_JAVA中输入和输出处理(Java I/O)重点总结

    文件-使用File类操作文件: 什么是文件?  文件可认为是相关记录或放在一起的数据的集合. 文件一般存储在哪里?  储存在存储设备里. Java程序如何访问文件?  Java API:java.io ...

  2. java怎样将日期本土化_Java中的日期操作

    在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...

  3. java斐波那切数列_Java中的递归方法

    递归算法 1.递归算法 递归在计算机科学中也称为递归算法.一些问题在分解的时候会有这样的现象:解决该问题的过程是由重复的相似子过程组成,类似这样的问题我们都可以通过递归算法进行解决.在计算机语言中,递 ...

  4. java中的方法在哪里_Java中的本机方法是什么,应在哪里使用?

    小编典典 Java中的本机方法是什么,应在哪里使用? 一旦看到一个小例子,就很清楚了: Main.java : public class Main { public native int intMet ...

  5. java中String类是什么_Java中字符串的学习(一)String类的概述及常见方法使用

    转载请注明出处http://www.cnblogs.com/devtrees/p/4347079.html (拓展:Api:编程语言对外给我们提供的应用程序接口.) 一.概述: 我们平时上网发帖,帖子 ...

  6. java中的this的用法_java中this的用法

    This,英语单词,发音:[英][ðɪs][美][ðɪs].常翻译为:这,这么.java中this的用法有哪些呢?本文是学习啦小编整理java中this的用法的资料,仅供参考. java中this的用 ...

  7. java io和nio的区别_Java中IO和NIO的本质和区别

    导读热词 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1 ...

  8. java的对象是什么意思_Java中对象和对象引用的区别,引用、指向是什么意思

    Java的变量分为两大类:基本数据类型和引用数据类型. 其中基本类型变量有四类8种:byte short int long float double char boolean,除了8种基本数据类型变量 ...

  9. java中的main的介绍_Java中的main函数详细讲解

    第二.可以在另一个类中向包含main()的类传递参数,如下例: public class A { public static void main(String[] args) { for(int i= ...

最新文章

  1. 如何使用Cisco命令阻止访问特定网站
  2. boost::gil::scale_lanczos用法的测试程序
  3. redis源码剖析(八)—— 当你启动Redis的时候,Redis做了什么
  4. Update your Twitter status using php
  5. 知道python_看完这篇文章,你就知道Python是什么?
  6. python代码解读器_python文章生成器(附源码+讲解)
  7. 07、基于ADC0808/ADC0809的多通道电压采集程序设计
  8. MySQL-存储过程-高效清理数据
  9. Hadoop大数据技术课程总结2021-2022学年第1学期
  10. Iterative Reweighted Least Squares(IRLS)
  11. 软考:计划评审技术(PERT)三点估算法计算工期、标准差、完成概率
  12. 基于4组DDR KU115的PCIe 光纤加速计算卡419 光纤PCIe卡
  13. 0pyqt获取textEdit控件的文本
  14. java(基础)_输入
  15. 子类内部调用父类成员函数,及子类对象在外部调用父类成员函数问题(C++)
  16. 【Devops实践】Git+Gitlab+Jenkins pipeline(maven+Sonarqube+harbor) +k8s 整合CICD
  17. 借势“双碳”目标东风,重塑股份全力推动氢燃料电池多场景应用
  18. PVCBOT【21号】挑战者--人形机甲战士
  19. IBM Thinkpad 自带软件详解
  20. CleanMyMac X 4.13.4不仅是Mac清理工具,也是一款专业的Mac杀毒软件

热门文章

  1. android音乐播放器开发 SweetMusicPlayer 实现思路
  2. C6657核心板资料:基于TI DSP TMS320C6657、XC7K325T的高速数据处理核心板 375
  3. 第13期 《由量变到质变的过程》3月刊
  4. HDU 2549 壮志难酬 (水题,但有个小坑!)
  5. python制作简单网页_Python制作简单的网页爬虫
  6. 刘亦菲新剧开播,再演古装剧,是否能超越仙剑剧?
  7. Apple Mac OS 0.97太酷了。。。呵呵,顺便分享某版本Mac源码
  8. Bochs源码分析 - 11:《X86探索及编程》代码初步解释
  9. SIMD 单指令,多数据
  10. node.js测试html tdd,nodejs的单元测试框架mocha