「java查看时区」java获取时区
本篇文章给大家谈谈java查看时区,以及java获取时区对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
北大青鸟java培训:Java中的时间处理?
在Java中,如何获取不同时区的当前时间?你知道这道题的正确答案应该如何回答吗?背后的原理又是什么呢?然后,紧接着,我又提出了以下问题:为什么以下代码无法得到美国时间。
(在东八区的计算机上)接下来,java课程培训机构就围绕这两个问题,来带领读者一起学习一下哪些和Java中的时间有关的概念。
时区前面提到了时区,可能很多读者不知道什么是时区,先来简单介绍一下。
时区是地球上的区域使用同一个时间定义。
以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。
1863年,首次使用时区的概念。
时区通过设立一个区域的标准时间部分地解决了这个问题。
世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差。
这些偏差就是所谓的时差。
为了照顾到各地区的使用方便,又使其他地方的人容易将本地的时间换算到别的地方时间上去。
有关国际会议决定将地球表面按经线从东到西,划成一个个区域,并且规定相邻区域的时间相差1小时。
在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。
当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时)接下来,本文就围绕这两个问题,来带领读者一起学习一下哪些和Java中的时间有关的概念。
时区前面提到了时区,可能很多读者不知道什么是时区,先来简单介绍一下。
时区是地球上的区域使用同一个时间定义。
以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。
1863年,首次使用时区的概念。
时区通过设立一个区域的标准时间部分地解决了这个问题。
世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差。
这些偏差就是所谓的时差。
为了照顾到各地区的使用方便,又使其他地方的人容易将本地的时间换算到别的地方时间上去。
有关国际会议决定将地球表面按经线从东到西,划成一个个区域,并且规定相邻区域的时间相差1小时。
在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。
当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时
java 如何获取当前系统的时区,不是时间
Calendar cal = Calendar.getInstance();
TimeZone timeZone = cal.getTimeZone();
System.out.println(timeZone.getID());
System.out.println(timeZone.getDisplayName());
你试试这个行不行
java中如何获取时区?
//我实现一个时钟窗口程序给你了,好让你更容易理解,希望对你有帮助。\x0d\x0aimport java.awt.*;\x0d\x0aimport java.awt.event.*;\x0d\x0aimport java.util.*;\x0d\x0a\x0d\x0a//世界时钟\x0d\x0apublic class TimerTest {\x0d\x0apublic static void main(String[] args) {\x0d\x0anew TimerTestFrame("世界时钟");\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0aclass TimerTestFrame extends Frame {\x0d\x0a/**\x0d\x0a* \x0d\x0a*/\x0d\x0aprivate static final long serialVersionUID = 1L;\x0d\x0a\x0d\x0apublic TimerTestFrame(String s) {\x0d\x0asuper(s);\x0d\x0aaddWindowListener(new WindowAdapter() {\x0d\x0apublic void windowClosing(WindowEvent e) {\x0d\x0adispose();\x0d\x0aSystem.exit(0);\x0d\x0a}\x0d\x0a});\x0d\x0asetLayout(new GridLayout(2, 6));\x0d\x0a\x0d\x0aClockCanvas clk1 = new ClockCanvas("北京", "GMT+8"); // 创建时钟\x0d\x0aClockCanvas clk2 = new ClockCanvas("巴黎", "GMT+2");\x0d\x0aClockCanvas clk3 = new ClockCanvas("华盛顿", "GMT-4");\x0d\x0aClockCanvas clk4 = new ClockCanvas("洛衫矶", "GMT-7");\x0d\x0aClockCanvas clk5 = new ClockCanvas("伦敦", "GMT+1");\x0d\x0aClockCanvas clk6 = new ClockCanvas("芝加哥", "GMT-5");\x0d\x0aadd(clk1);\x0d\x0aadd(clk2);\x0d\x0aadd(clk3);\x0d\x0aadd(clk4);\x0d\x0aadd(clk5);\x0d\x0aadd(clk6);\x0d\x0asetSize(500, 350); // 设置框架宽高\x0d\x0asetVisible(true);\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0aclass ClockCanvas extends Canvas implements Runnable {\x0d\x0a/**\x0d\x0a* \x0d\x0a*/\x0d\x0aprivate static final long serialVersionUID = 1L;\x0d\x0a\x0d\x0aprivate int seconds = 0;\x0d\x0a\x0d\x0aprivate String city;\x0d\x0a\x0d\x0aprivate GregorianCalendar calendar;\x0d\x0a\x0d\x0aThread t;\x0d\x0a\x0d\x0apublic ClockCanvas(String c, String tz) {\x0d\x0acity = c;\x0d\x0a//也可以通过TimeZone.setTimeZone(String n)函数改变时区,n为时区参数名。\x0d\x0acalendar = new GregorianCalendar(TimeZone.getTimeZone(tz));\x0d\x0at = new Thread(this);\x0d\x0at.start();\x0d\x0asetSize(125, 125); // 设置画布大小\x0d\x0asetBackground(Color.black);\x0d\x0a}\x0d\x0a\x0d\x0a// 重写父类的方法绘制时钟图形\x0d\x0apublic void paint(Graphics g) {\x0d\x0aGraphics2Dg2d = (Graphics2D) g;\x0d\x0aBasicStroke bstroke = new BasicStroke(2.0f);\x0d\x0ag2d.setStroke(bstroke);\x0d\x0ag2d.setColor(Color.green);\x0d\x0ag2d.drawOval(0, 0, 100, 100);\x0d\x0abstroke = new BasicStroke(5.0f);\x0d\x0ag2d.setStroke(bstroke);\x0d\x0ag2d.drawLine(50, 0, 50, 5);\x0d\x0ag2d.drawLine(0, 50, 5, 50);\x0d\x0ag2d.drawLine(50, 95, 50, 98);\x0d\x0ag2d.drawLine(95, 50, 98, 50);\x0d\x0adouble hourAngle = 2 * Math.PI * (seconds - 3 * 60 * 60)\x0d\x0a/ (12 * 60 * 60);\x0d\x0adouble minuteAngle = 2 * Math.PI * (seconds - 15 * 60) / (60 * 60);\x0d\x0adouble secondAngle = 2 * Math.PI * (seconds - 15) / (60);\x0d\x0abstroke = new BasicStroke(5.0f);\x0d\x0ag2d.setStroke(bstroke);\x0d\x0ag2d.drawLine(50, 50, 50 + (int) (30 * Math.cos(hourAngle)),\x0d\x0a50 + (int) (30 * Math.sin(hourAngle)));\x0d\x0abstroke = new BasicStroke(3.0f);\x0d\x0ag2d.setStroke(bstroke);\x0d\x0ag2d.drawLine(50, 50, 50 + (int) (40 * Math.cos(minuteAngle)),\x0d\x0a50 + (int) (40 * Math.sin(minuteAngle)));\x0d\x0abstroke = new BasicStroke(1.0f);\x0d\x0ag2d.setStroke(bstroke);\x0d\x0ag2d.drawLine(50, 50, 50 + (int) (45 * Math.cos(secondAngle)),\x0d\x0a50 + (int) (45 * Math.sin(secondAngle)));\x0d\x0ag2d.setColor(Color.red);\x0d\x0ag2d.drawString(city, 35, 115);\x0d\x0a}\x0d\x0a\x0d\x0apublic void timeElapsed() {\x0d\x0a//new Date()()获得当前时间\x0d\x0aSystem.out.println(new Date()());\x0d\x0acalendar.setTime(new Date()());\x0d\x0aseconds = calendar.get(Calendar.HOUR) * 60 * 60\x0d\x0a+ calendar.get(Calendar.MINUTE) * 60\x0d\x0a+ calendar.get(Calendar.SECOND);\x0d\x0a}\x0d\x0a\x0d\x0apublic void run() {\x0d\x0atry {\x0d\x0awhile (true) {\x0d\x0aThread.sleep(300);\x0d\x0atimeElapsed();\x0d\x0arepaint();\x0d\x0a}\x0d\x0a} catch (InterruptedException e) {\x0d\x0a}\x0d\x0a}\x0d\x0a}
时区的坑,不想再踩了
最近在使用date命令时,发现表示东8区(中国时区)要使用 GMT-8 ,但在Java中却需要使用 GMT+8 ,如下:
而在Java中,如下:
这就让人有点迷糊了,经过一段时间搜索,发现在时区表达形式上还有不少知识点呢!
众所周知,为了方便各地区本地时间之间的转换,人们将全球划分为了24个时区,以格林尼治天文台(GMT)为零时区,往东西两个方向分别有12个时区,所以自然有了以GMT为前缀的时区表示法,如下:
GMT+8 表示东8区,中国就是使用这个时区,而 GMT-8 表示西8区,如果格林尼治天文台的本地时间是2022-03-19的0点,那么 GMT+8 地区的本地时间就是2022-03-19的8点,而 GMT-8 的本地时间就是往前8小时,即2022-03-18的16点。
注意,上面的各地区本地时间的表述虽然不同,但它们实际是同一个时刻(绝对时间),要理解本地时间与绝对时间的区别。
GMT+8 正是Java中支持的时区表示法,那为啥Linux中却是 GMT-8 呢?实际上Linux中的 GMT-8 也可以写成 Etc/GMT-8 ,这才是它的标准名称,如下:
可以发现用 Etc/GMT-8 的话,Linux与Java的输出都是一样的了,是的, Etc/GMT-8 也是一种类似 GMT+8 的时区表示机制,只不过它的 +- 号是反的。
Ok,虽然上面的差异弄清楚了,但时区的表示形式还没有介绍完,接着往下看...
除了 GMT+8 表示方式外,我们还经常会看到 UTC+8 这样的表示方式,这是UTC时区表示法。
即生GMT何生UTC?这是由于GMT是以格林尼治天文台为时间基准,但地球不是完美球体且自转速度在变慢,所以地球自转速度并不均匀,这导致以格林尼治天文台为时间基准是不准的。
为了更准确度量时间,科学家们发明了UTC时间,以铯原子跃迁次数来度量时间,比GMT时间更准确,为了保证GMT的准确性,每隔几年GMT时间会做一次调整,以与UTC时间对齐。
因此,既然有了更准确的UTC,那么就有了以UTC为前缀的时区表示法,如中国时区可使用 UTC+8 。
各时区偏移量表示法一览表,如下:
除了用偏移量来表示时区,为了方便,人们还按区域/城市的方式来定义时区,如 Asia/Shanghai , Asia/Hong_Kong 都表示东8区,具体有哪些城市命名的时区,可以在时区数据库中查看。
另外,为了简化区域时区表示法,又定义了一套时区缩写,如CST是中国时区 China Standard Time 的缩写,可以在时区缩写中查看各种缩写定义。
注意,一般都不建议使用时区缩写,因为时区缩写的命名经常会重复,比如CST是 Central Standard Time (北美中部标准时间UTC -6)、 China Standard Time (中国标准时间UTC +8)、 Cuba Standard Time (古巴标准时间UTC -5)。
由于不同软件对CST的解释可能不同,导致会出现时间相差13或14个小时的情况,这在Java搭配MySQL时经常出现,我还专门写了一篇文章mysql的timestamp会存在时区问题?,对于一定要使用时区缩写的场景,可以使用香港时区缩写 HKT ,它不重复且和上海处于同一个时区。
在Java中和时区相关的类有TimeZone、ZoneId,其中TimeZone是老的时区类,而ZoneId是新的时区类,它有ZoneOffset和ZoneRegion两个子类,分别代表偏移量表示法和区域表示法。
那它们都支持上述的哪些时区写法呢?写个Demo验证一下,如下:
输出如下:
虽然偏移量表示法与区域表示法都可以表示时区,但由于夏令时的存在,它们并不完全等同。
夏令时(Daylight Saving Time: DST),也叫 夏时制,是指为了节约能源,在天亮的早的夏季,人为将时间调快一小时,以充分利用光照资源,节约照明用电。
而中国在 1986 年至 1991 年也实行过夏令时,在1986~1991的每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。
故会有下面看起来有点奇怪的现象:
为什么 Asia/Shanghai 输出为3点,而 GMT+8 输出为2点呢?原因是 1986-05-04 02:00:00 这个时间点中国正开始实行夏令时,时钟拨快了1小时。
而 GMT+8 为什么输出为2点呢?因为中国、马来西亚、菲律宾、新加坡的时区都是 GMT+8 ,只有中国在实行夏令时,而在 GMT+8 中没法感知到区域信息,那java只能以没有实行夏令时的方法来计算本地时间了。
正是由于夏令时的存在,导致程序可能出现诡异的现象甚至bug,如下:
输出如下:
为啥会这样呢?原因是本地时间虽然看起来没变,但 Asia/Shanghai 这个代表的时区却发生了变化。
我们可以将上面 printZonedDateTime 中时间格式由 yyyy-MM-dd HH:mm:ss VV 修改为 yyyy-MM-dd HH:mm:ss VV xxx 再执行,发现输出如下:
如上,夏令时导致 Asia/Shanghai 这个时区不一定是东8区了,也可能是东9区,故Java中,想将ZoneRegion转换为ZoneOffset,需要传递一个instant时刻参数,如下:
夏令时真是一种自欺欺人的做法,还好中国从1991年后就没再实行了!
关于java查看时区和java获取时区的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。