Android程序中的时间


Android程序中的时间_第1张图片
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(位置:深圳南山区)

你可能感兴趣的:(Android程序中的时间)