image.png
导言
众所周知,所有的程序中都会用到时间,而且每个系统中都会有一个处理时间的工具类DateUtils。时间在不同的地方需要格式化为不同的形式,比如存数据库,多数会采用时间戳;在界面上展示则会格式化为一些固定格式,类似于2018-04-25 18:15:22
。
如果App支持国际化,还需要处理跨国时间,需要考虑时区和夏令时。
下面就介绍一下在代码中怎么处理不同地区时间的转换。
时区
地球划分24个时区,分别是东十二个区,西十二个区。以伦敦格林威治天文台为零时区,向东为东一区到东十二区,向西是西一区到西十二区,东区时间比西区早,经度每15度为一个时区,比如北京位于东120度经线,属于东八区。
程序中也有时区概念,以Java为例,可以通过下面方式获取时区:
/**
* 获取美国东部时区
*/
public static TimeZone getEastUsTimeZone() {
return TimeZone.getTimeZone("America/New_York");
}
/**
* 获取中国时区
*/
public static TimeZone getChinaTimeZone() {
return TimeZone.getTimeZone("Asia/Shanghai");
}
时间戳
时间戳(Timestamp),是指从格林威治时间1970.01.01 00:00:00(北京时间1970.01.01 08:00:00)起至现在的总秒数
,目前的时间戳是10位,如果以毫秒表示则是13位。
时间戳在代码中很常用,尤其是后台API接口,基本都需要返回时间戳,前端可以把时间戳格式化为自己想要的格式来展示。
Android中也是支持时间戳的,最常用的是获取当前时间戳,代码如下:
//Android获取当前时间戳
public static Long getCurrentTimestamp() {
return System.currentTimeMillis();
}
夏令时和冬令时
高纬度和中纬度的许多国家为了充分利用夏季的太阳光照,节约照明用电,而又不变动作息时间,实行夏令时。即在夏季到来之前,把时针拨快一个小时,到下半季秋季到来之前,再把时针拨回一个小时。不同国家实行夏令时的时间不太一样,美国是3月11日至11月7日。
我们国家有段时间也实行了夏令时(1986年-1991年),1992年就不在实行了。
如果App支持国际化功能,也需要考虑夏令时冬令时,Java中提供了方法可以判断当前时间是否处于夏令时,方法如下:
/**
*@param zone 时区,传入不同的时区可以判断不同地区是否处于夏令时
*/
public static boolean isDaylight(TimeZone zone, Date date) {
return zone.useDaylightTime() && zone.isDaylightTime(date);
}
而且java中时间戳的转换自动支持夏令时冬令时。
时间戳和日期的转换
下面介绍一下时间戳和日期的相互转换,以及不同时区间日期的转换
Date转换为指定时区的日期字符串:
/**
* Date 转换为指定时区日期字符串
*/
public static String date2Str(TimeZone timeZone, Date date, String pattern) {
if (date == null) {
return "";
}
if (timeZone == null) {
timeZone = TimeZone.getDefault();
}
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern, Locale.US);
dateFormat.setTimeZone(timeZone);
return dateFormat.format(date);
} catch (NullPointerException | IllegalArgumentException ex) {
LogUtil.error(ex, ex.getMessage());
ex.printStackTrace();
return "";
}
}
时间戳转换为指定时区的日期字符串
/**
* 时间戳转换为指定时区日期字符串
*/
public static String timeMillis2Str(TimeZone timeZone, long milliSeconds, String pattern) {
if (milliSeconds == 0) {
return "";
}
return date2Str(timeZone, new Date(milliSeconds), pattern);
}
指定时区的字符串转换为时间戳
/**
* 指定时区的日期字符串转换时间戳
*/
public static long str2TimeMillis(TimeZone timeZone, String dateStr, String pattern) {
Date date = str2Date(timeZone, dateStr, pattern);
return date.getTime();
}
从上面几个方法中可以看出来,时间戳和日期字符串主要是通过Date类进行转换的,那么Date是什么呢?
Date对象中存储的内容并不是年月日时分秒,而是一个long型变量,它的值是自1970.01.01 00:00:00至Date对象记录时刻经过的毫秒数
,即时间戳的毫秒表示。调用Date的getTime()
方法可以获取这个值。
Date date = new Date();
System.out.println(date + "," + date.getTime());
总结
本文主要介绍几个概念:时区、时间戳、夏令时,以及不同时区之间的时间转换,包括时间戳和指定时区日期之间的转换,希望对大家有帮助。
写于2018.04.25下午23:00(位置:深圳南山区)
网友评论