关于Java时区的详解

一. 基本概念
时区 :time zone 1884年国际经线会议规定,全球按经度分为24个时区,每区各占经度15°。
以本初子午线为中央经线的时区为零时区,由零时区向东、西各分12区,东、西12区都是半时区,共同使用180°经线的地方时。
CST :China Standard Time UTC+8:00 中国标准时间(北京时间),在东八区
UTC :Universal Time Coordinated,世界协调时间,又称世界标准时间、世界统一时间。UTC 提供了一种与时区无关(或非特定于时区)的时间。
世界上的所有时区都可以表示为 UTC 加上或减去一个偏移量。
因此,UTC是0时区的时间,如北京为早上八点(东八区),UTC时间就为零点,时间比北京时晚八小时
GMT :Greenwich Mean Time格林威治标准时间,指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
Unix timestamp :Unix时间戳,或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,
定义为从格林威治时间(UTC/GMT的午夜)1970年01月01日00时00分00秒起至现在的总秒数。
可以这么说:
UTC和GMT几乎是同一概念,两者的区别是GMT是一个天文上的概念,UTC是基于原子钟。
GMT=UTC
GMT + 8 = UTC + 8 = CST
UTC+时间差=本地时间 (时间差东为正,西为负,东八区记为 +0800)

/**
*@Author Rambo
*@Desc:通过毫秒获取Calendar
*@param millis
*@return TODO
*@Version DateUtils.java,v 1.1 2015-1-21 上午11:22:54
*/
public static Calendar getCalendar(long millis) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(millis);
return cal;
}

/**
*@Author Rambo
*@Desc:通过日期获取Calendar
*@param date
*@return TODO
*@Version DateUtils.java,v 1.1 2015-1-21 上午11:23:07
*/
public static Calendar getCalendar(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal;
}
public static Date convertStringToDate(String strDate, String pattern) {
if (StringUtils.isStringEmpty(strDate))
return null;
if (StringUtils.isStringEmpty(pattern))
pattern = PATTERN_DATETIME;
SimpleDateFormat df = new SimpleDateFormat(pattern);
try {
return df.parse(strDate);
} catch (ParseException e) {
logger.error(strDate + "转化成" + pattern + "出现异常!");
return null;
}
}
public static void main(String[] args) {
Date local1970 = DateUtils.convertStringToDate("1970-01-01 00:00:00", "yyyy-MM-dd HH:mm:ss");
System.out.println("当前时区的格林尼治时间的毫秒数:"+local1970.getTime());
// TimeZone timeBJ = TimeZone.getTimeZone("PRC");//得到北京时间的时区
TimeZone timeBJ = TimeZone.getTimeZone("GMT+8");//得到北京时间的时区
String[] strs = timeBJ.getAvailableIDs();
for (int i = 0; i < strs.length; i++) {
System.out.println("东八区ID:"+strs[i]);
}
System.out.println(timeBJ.getOffset(local1970.getTime()));
//所以如果要获取当地正确的时间
TimeZone timeLocal = TimeZone.getTimeZone(getCalendar(local1970).getTimeZone().getID());//得到当前时间的时区
long timeZoneMi= timeLocal.getOffset(local1970.getTime());//当前时间要扣减的毫秒数
long date1970 = local1970.getTime() + timeZoneMi;
System.out.println("1970年格林威治时间的毫秒数:"+date1970);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值