在Java中,如何获取不同时区的当前时间?你知道这道题的正确答案应该如何回答吗?背后的原理又是什么呢?然后,紧接着,我又提出了以下问题:为什么以下代码无法得到美国时间。
(在东八区的计算机上)接下来,java课程培训机构http://www.kmbdqn.cn/就围绕这两个问题,来带领读者一起学习一下哪些和Java中的时间有关的概念。
时区前面提到了时区,可能很多读者不知道什么是时区,先来简单介绍一下。
时区是地球上的区域使用同一个时间定义。
以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。
1863年,首次使用时区的概念。
时区通过设立一个区域的标准时间部分地解决了这个问题。
世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差。
这些偏差就是所谓的时差。
为了照顾到各地区的使用方便,又使其他地方的人容易将本地的时间换算到别的地方时间上去。
有关国际会议决定将地球表面按经线从东到西,划成一个个区域,并且规定相邻区域的时间相差1小时。
在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。
当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时)接下来,本文就围绕这两个问题,来带领读者一起学习一下哪些和Java中的时间有关的概念。
时区前面提到了时区,可能很多读者不知道什么是时区,先来简单介绍一下。
时区是地球上的区域使用同一个时间定义。
以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。
1863年,首次使用时区的概念。
时区通过设立一个区域的标准时间部分地解决了这个问题。
世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差。
这些偏差就是所谓的时差。
为了照顾到各地区的使用方便,又使其他地方的人容易将本地的时间换算到别的地方时间上去。
有关国际会议决定将地球表面按经线从东到西,划成一个个区域,并且规定相邻区域的时间相差1小时。
在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。
当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时
//我实现一个时钟窗口程序给你了,好让你更容易理解,希望对你有帮助。import java.awt.*
import java.awt.event.*
import java.util.*
//世界时钟
public class TimerTest {
public static void main(String[] args) {
new TimerTestFrame("世界时钟")
}
}
class TimerTestFrame extends Frame {
/**
*
*/
private static final long serialVersionUID = 1L
public TimerTestFrame(String s) {
super(s)
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose()
System.exit(0)
}
})
setLayout(new GridLayout(2, 6))
ClockCanvas clk1 = new ClockCanvas("北京", "GMT+8")// 创建时钟
ClockCanvas clk2 = new ClockCanvas("巴黎", "GMT+2")
ClockCanvas clk3 = new ClockCanvas("华盛顿", "GMT-4")
ClockCanvas clk4 = new ClockCanvas("洛衫矶", "GMT-7")
ClockCanvas clk5 = new ClockCanvas("伦敦", "GMT+1")
ClockCanvas clk6 = new ClockCanvas("芝加哥", "GMT-5")
add(clk1)
add(clk2)
add(clk3)
add(clk4)
add(clk5)
add(clk6)
setSize(500, 350)// 设置框架宽高
setVisible(true)
}
}
class ClockCanvas extends Canvas implements Runnable {
/**
*
*/
private static final long serialVersionUID = 1L
private int seconds = 0
private String city
private GregorianCalendar calendar
Thread t
public ClockCanvas(String c, String tz) {
city = c
//也可以通过TimeZone.setTimeZone(String n)函数改变时区,n为时区参数名。
calendar = new GregorianCalendar(TimeZone.getTimeZone(tz))
t = new Thread(this)
t.start()
setSize(125, 125)// 设置画布大小
setBackground(Color.black)
}
// 重写父类的方法绘制时钟图形
public void paint(Graphics g) {
Graphics2Dg2d = (Graphics2D) g
BasicStroke bstroke = new BasicStroke(2.0f)
g2d.setStroke(bstroke)
g2d.setColor(Color.green)
g2d.drawOval(0, 0, 100, 100)
bstroke = new BasicStroke(5.0f)
g2d.setStroke(bstroke)
g2d.drawLine(50, 0, 50, 5)
g2d.drawLine(0, 50, 5, 50)
g2d.drawLine(50, 95, 50, 98)
g2d.drawLine(95, 50, 98, 50)
double hourAngle = 2 * Math.PI * (seconds - 3 * 60 * 60)
/ (12 * 60 * 60)
double minuteAngle = 2 * Math.PI * (seconds - 15 * 60) / (60 * 60)
double secondAngle = 2 * Math.PI * (seconds - 15) / (60)
bstroke = new BasicStroke(5.0f)
g2d.setStroke(bstroke)
g2d.drawLine(50, 50, 50 + (int) (30 * Math.cos(hourAngle)),
50 + (int) (30 * Math.sin(hourAngle)))
bstroke = new BasicStroke(3.0f)
g2d.setStroke(bstroke)
g2d.drawLine(50, 50, 50 + (int) (40 * Math.cos(minuteAngle)),
50 + (int) (40 * Math.sin(minuteAngle)))
bstroke = new BasicStroke(1.0f)
g2d.setStroke(bstroke)
g2d.drawLine(50, 50, 50 + (int) (45 * Math.cos(secondAngle)),
50 + (int) (45 * Math.sin(secondAngle)))
g2d.setColor(Color.red)
g2d.drawString(city, 35, 115)
}
public void timeElapsed() {
//new Date()()获得当前时间
System.out.println(new Date()())
calendar.setTime(new Date()())
seconds = calendar.get(Calendar.HOUR) * 60 * 60
+ calendar.get(Calendar.MINUTE) * 60
+ calendar.get(Calendar.SECOND)
}
public void run() {
try {
while (true) {
Thread.sleep(300)
timeElapsed()
repaint()
}
} catch (InterruptedException e) {
}
}
}