java获取中国时间代码(适用全球任意机器)

这个问题出自我写的代码需要运行在服务器上。本来的代码是这样写的:

import java.text.*;
import java.util.*;

public final class NowDateTime
{
	public static final String get()
	{        
		Calendar cal = Calendar.getInstance();        
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
		String cdate = df.format(cal.getTime());     
		
		return cdate;    
	}
	
	public static void main(String[] args)
	{
		System.out.println(get());
	}
}

乍看之下没有问题,确实,在我自己的电脑上获取的确实是当前的时间,本人在中国,要的也是中国时间,这一点在这篇文章中很重要。


但是奇怪的,明明格式中写了“HH”,也就是要求24小时制的时间,可是每一次把程序上传到服务器之后,运行的到的程序都是12小时制的,奇了怪了。由于服务器是ubuntu的,开始的时候,我以为是ubuntu的jvm和windows的jvm对相同的代码有不同的行为,虽然java本身以跨平台为特色,但是有那么一两个bug也是可以接受的嘛~~


结果有一天……我仔细看了一下java的文档,虽然文档没有直接说明我的困惑,但是一个方法却让我发现了端倪,那是DateFormat.setTimeZone方法。是的!是时区,服务器再美国,所以在服务器上获取的时间,是美国时间相差12个小时。虽然以前就知道,但是没想到真的如此接近,只相差几分钟,这几分钟被习以为常地用误差解释了。实际上,阴差阳错的是,我次测试都是在下午,中国时间>12,美国时间<12,就造成了一个24小时制,一个是12小时制的假象,所以根本没有注意到时区的问题。知道什么问题之后我改写了代码,明确说明要中国的时区——"Asia/Chongqing"(即“亚洲/重庆”)或"Asia/shanghai"


所以更改之后的代码如下:

import java.text.*;
import java.util.*;

// 获取当前日期时间的静态方法
public final class NowDateTime
{
	public static final String get()
	{   
		Calendar cal = Calendar.getInstance();
		// 设置格式化的SimpleDateFormat对象,指定中国语言环境
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
		// 创建时区(TimeZone)对象,设置时区为“亚洲/重庆"
		TimeZone TZ = TimeZone.getTimeZone("Asia/Chongqing");
		// 将SimpleDateFormat强制转换为DateFormat
		DateFormat df = null;
		try
		{
			df = (DateFormat)sdf;
		}
		catch(Exception E)
		{
			E.printStackTrace();
		}
		// 为DateFormat对象设置时区
		df.setTimeZone(TZ);
		// 获取时间表达式
		String cdate = df.format(cal.getTime());     
		
		return cdate;    
	}
	
	public static void main(String[] args)
	{
		System.out.println(get());
	}
}

这样在任何国家和地区,任何支持java SE的机器上,都能直接拿到中国时间了(如果java跨平台特性真的是完善的话)。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值