在java中怎么获取北京时间各位不要吝啬!

Python014

在java中怎么获取北京时间各位不要吝啬!,第1张

//这是通过网络获取北京时间的方法

java.util.Locale locale=java.util.Locale.CHINA//这是获得本地中国时区

String pattern = "yyyy-MM-dd kk:mm:ss zZ"//这是日期格式

java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(pattern,locale)//设定日期格式

java.util.Date date = new java.util.Date()

java.net.URL url=new URL("http://www.bjtime.cn")//取得资源对象

java.net.URLConnection uc=url.openConnection()//生成连接对象

uc.connect()//发出连接

long ld=uc.getDate()//取得网站日期时间

date=new Date(ld)//转换为标准时间对象

String bjTime = df.format(date)

System.out.println("北京时间:"+bjTime)

//我实现一个时钟窗口程序给你了,好让你更容易理解,希望对你有帮助。\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}

三种情况

1.java下使用new date()获取的时间会和真实的本地时间相差8小时。

2.本地获取的时间没有错,存入数据库的时候时间相差8小时。

3.数据库时间没有错,获取到了后端,之后返回给前端相差8小时。

原因:

1.new date()调用的是jvm时间,而jvm使用的时间默认是0时区的时间,即:和北京时间将会相差8小时。

2.mybatis将本地的数据传入到mysql数据库服务器的时候,服务器会对数据进行检测,会把date类型的数据自动转换为mysql服务器所对应的时区,即0时区,所以会相差8小时。

3.springboot中对加了@RestController或者@Controller+@ResponseBody注解的方法的返回值默认是Json格式,

所以,对date类型的数据,在返回浏览器端时,会被springboot默认的Jackson框架转换,而Jackson框架默认的时区GMT(相对于中国是少了8小时)。所以最终返回到前端结果是相差8小时。

解决方案:

1.手动设置jvm时间:将时间改为第8时区的时间。

TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"))

2.在apprication.yml文件中配置一下数据库连接信息,url加上:&serverTimezone=GMT%2b8。

3.将spring的json构造器的时区改正即可,在application.yml文件中添加。

或者可以使用注解,在entity实体类的date数据上添加注解,那么数据库传回的data数据要转换为json格式的时候就是北京时间了,再次传回到前端的时候,也不会出现时区问题.