美文网首页
Android程序中的时间

Android程序中的时间

作者: 左大人 | 来源:发表于2018-04-25 23:22 被阅读0次

    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程序中的时间

          本文链接:https://www.haomeiwen.com/subject/topulftx.html