Android中有关日期时及时区的使用总结

By admin in 天文台 on 2018年10月9日

在开发Android的进程中,出现了几糟糕出于日期时导致的题材,而且要是由时区的原委造成,所以直接怀念总结一下,形成一个出色的开销规范。

 

一、Unix时间戳

 

  Unix时间戳(Unix timestamp),或如Unix时间(Unix time)、POSIX时间(POSIX
time),是如出一辙栽时光代表法,定义也于格林威治时间1970年01月01日00不时00分00秒起及本底总秒数。Unix时间戳不仅受使用在Unix系统、类Unix系统被,也在众多其他操作系统中叫大规模采用。

 

其次、关于时间标准及时区

 

  1、原子时:International Atomic Time (IAT)

 

    又如国际原子时,是千篇一律种通过原子钟得到的日标准,原子钟是世界上早已知道最标准的时间测量与频率标准,原子钟在
37 亿年之误差不超 1 秒。

 

  2、世界时:Universal Time(UT)

 

    是均等栽为格林尼治子夜起算的平太阳时。世界经常凡坐地自转为基准得到的时间尺度,其精度受到地球自转不全匀变化以及极致移的熏陶,为了缓解这种影响,1955年国际天文联合会概念了UT0、UT1和UT2老三单网,他们三者之间是推的干,后者还是意识前者的有些度差别,通过修正得到更净匀的时标。

 

    在格林尼治子午线上之平太阳时名为世界经常(UT0),又吃格林尼治平时(GMT)。格林尼治标准日(旧译格林尼治平均日还是格林威治标准时间,英语:Greenwich
Mean
Time,GMT)是凭借在英国伦敦郊区的皇格林尼治天文台的正经时间,因为本初子午线被定义在经那里的经线。自1924年2月5日开始,格林尼治天文台每隔一钟头会于中外发放调时信息。

 

  2、协调世界时:Coordinated Universal Time(UTC)

 

    又如世界标准日、世界统一时间。是经平分太阳经常(以格林威治时间GMT为依照)、地轴运动修正后底初时标以及因“秒”为单位之国际原子时所综合计算而成的时,计算过程相当严谨精密,因此要因为“世界标准时间”的角度来说,UTC比GMT更精准。其误差值必须保障以0.9秒之内,若超过0.9秒则由于位于巴黎之国际地球自转事务中央局发布闰秒,使UTC与球自转周期同。

 

    基本上UTC的真相强调的是于GMT更确切的世界时标准,UTC中几近一个闰秒的调动,以保协调世界时(UTC)与格林尼治平时(GMT)相差不会见过0.9秒,并在发生需要的时节以协调世界时(UTC)内长刚还是负闰秒。

 

    UTC被运用在多数之处理器及台网正式中。

 

  3、夏令时与冬令时:Daylight Saving Time(DST)

 

    又如“日光节约时制”和“夏令时间”,是平种植呢节约能源而人工规定地方时间的制,在当时无异于制实践期间所运用的集合时间称为“夏令时间”。一般以亮早的夏人工将日提前一小时,可以假设人头早起早睡,减少照明量,以充分利用光照资源,从而省去照明用电。各个采纳夏时制的国家实际规定不同。目前全球产生近110只邦每年要履行夏令时。自2011年3月27日始于俄罗斯千古使用夏令时,把时光拨快一时,不再调回。

 

    简单来说,使用夏令时与冬令时即在夏天用时间拨快一个钟头,等到冬还用时刻拨慢一个时。

 

  4、CST

 

    CST同时代表澳大利亚、美国、中国、古巴四独邦的业内时间,时区分别吗:

 

     澳洲中间时间,Central Standard Time (Australia) UT+9:30

     中部标准时区(北美洲),Central Standard Time (North America)
UT-6:00

     北京时间,China Standard Time UT+8:00

     古巴标准日,Cuba Standard Time UT-4:00

 

  以开发时我们得专注不同国家的时区,并且UTC和GMT在电脑体系受采取并任明确差别,可就是等同。

 

二、规范

 

  在其实开支被,当岁月用来展示时,非新鲜要求下一般用系统默认的时区时作显示时间。将时刻开为多少存储或传递给任何系统时(特别是跨平台调用),则最好应用正式的UTC/GMT时间(后面统称GMT),除非事先约定或标识了光阴之类别。

 

老三、在Android中待特别注意的事项

 

  1、Android中代表日期时的品种,有Date、Calendar,他们于没出示设置其常常区经常,取到之当前时刻全都为系统默认时区的时,即使给定一个时刻,同样是据系统默认时区来换算时,所以说他们都是和时区相关的。

 

  2、SimpleDateFormat对象自我也是跟时区相关。

 

    当使用parse将一个字符串格式的日期变为Date对象,或者将一个Date对象转换为字符串日期时,这个字符串日期的时区以SimpleDateFormat关联的时区为遵循,如果由此setTimeZone修改了时区,则是字符串日期为改后底时区为以。例如:

 

// 2013-1-31 22:17:14

Date date = new Date(1359641834000L);

System.out.println(date);

String dateStr = “2013-1-31 22:17:14”;

SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd
HH:mm:ss”);

dateFormat.setTimeZone(TimeZone.getTimeZone(“GMT”));

try

{

    //
对于已设定也GMT时间标准的dateFormat来说,一切得外换的字符串日期都是GMT标准时间,转换后赶回的Date由于默认遵守系统默认时区,所以换为Date的日期需要+8(例如北京标准时区),也就算是时区与正式各异造成的时差。

    Date dateTmp = dateFormat.parse(dateStr);

    System.out.println(dateTmp);

catch (ParseException e) 

{

    e.printStackTrace();  

}  

// Date还是照系统默认时区,而format格式化处来之字符串是GMT,所以如果-8。

String dateStrTmp = dateFormat.format(date);  

System.out.println(dateStrTmp);

    输出结果也:image

  3、Calendar于非手动设置时区时,是与网默认时区相关的。在手动修改时区后,不克运用calendar.getTime方法来直接得到Date日期,因为这底日子以及setTime时之价值相同,想如果对获取修改时区后底流年,应该经过calendar的get方法。例如:

 

Date date = new Date(1359641834000L);

System.out.println(date);

Calendar calendar = Calendar.getInstance();

calendar.setTimeZone(TimeZone.getTimeZone(“GMT”));  

// 或者好 Calendar calendar =
Calendar.getInstance(TimeZone.getTimeZone(“GMT”));  

calendar.setTime(date);

System.out.println(calendar.get(Calendar.HOUR_OF_DAY) + “:” +
calendar.get(Calendar.MINUTE));

 

Calendar calendar2 = Calendar.getInstance();  

calendar2.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND));

 

System.out.println(calendar.getTime());  

System.out.println(calendar2.getTime());

    输入结果吗:image

 

  4、TimeZone

 

    在出被,我们好透过TimeZone对象获得有关系统默认时区及其相关的详细信息。

 

季、Android关于日期的工具类

 

/**

 * Copyright (C) 2011, BHJ

 * All rights reserved.

 * 

 * 文件名称:

 * 文件标识:

 * 文件摘要:

 * 

 * 当前版本:

 * 作    者:

 * 完成日期:2013-12-20

 * 

 * 取代版:

 * 修改时间:

 * 修 改 人:

 * 修改摘要:

 */

 

package com.bhj.timetest;

 

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.TimeZone;

 

/**

 * 日期工具类(未特别说明的皆为系统默认时区下之年月)

 * */

public class DateUtil

{    

    /** 1s==1000ms */

    private final static int TIME_MILLISECONDS = 1000;

    /** 时间中的剪切、秒最酷价值均为60 */

    private final static int TIME_NUMBERS = 60;

    /** 时间中的小时最好充分值 */

    private final static int TIME_HOURSES = 24;

    /** 格式化日期的科班字符串 */

    private final static String FORMAT = “yyyy-MM-dd HH:mm:ss”;

    

    /**

     * 获取时区信息

     * */

    public static TimeZone getTimeZone()

    {

        return TimeZone.getDefault();

    }

    

    /**

     * 将日期字符串转换为Date对象

     * @param date 日期字符串,必须也”yyyy-MM-dd HH:mm:ss”

     * @return 日期字符串的Date对象表达形式

     * */

    public static Date parseDate(String date)

    {

        return parseDate(date, FORMAT);

    }

    

    /**

     * 将日期字符串转换为Date对象

     * @param date 日期字符串,必须也”yyyy-MM-dd HH:mm:ss”

     * @param format 格式化字符串

     * @return 日期字符串的Date对象表达形式

     * */

    public static Date parseDate(String date, String format)

    {

        Date dt = null;

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);

        try

        {

            dt = dateFormat.parse(date);

        }

        catch(ParseException e)

        {

            e.printStackTrace();

        }

        

        return dt;

    }

    

    /**

     * 将Date对象转换为指定格式的字符串

     * @param date Date对象

     * @return Date对象的字符串表达形式”yyyy-MM-dd HH:mm:ss”

     * */

    public static String formatDate(Date date)

    {

        return formatDate(date, FORMAT);  

    }

    

    /**

     * 将Date对象转换为指定格式的字符串

     * @param date Date对象

     * @param String format 格式化字符串

     * @return Date对象的字符串表达形式

     * */

    public static String formatDate(Date date, String format)

    {

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);  

        return dateFormat.format(date);  

    }

 

    /**

     * 格式化日期

     * @param long unixTime unix时间戳

     * @return 日期字符串”yyyy-MM-dd HH:mm:ss”

     * */

    public static String formatUnixTime(long unixTime)

    {  

        return formatUnixTime(unixTime, FORMAT);

    }

    

    /**

     * 格式化日期

     * @param long unixTime unix时间戳

     * @param String format 格式化字符串

     * @return 日期字符串

     * */

    public static String formatUnixTime(long unixTime, String format)

    {

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);  

        return dateFormat.format(unixTime);  

    }

    

    /**

     * 将GMT日期格式化为系统默认时区的日子字符串表达形式

     * @param gmtUnixTime GTM时间戳

     * @return 日期字符串”yyyy-MM-dd HH:mm:ss”

     * */

    public static String formatGMTUnixTime(long gmtUnixTime)

    {

        return formatGMTUnixTime(gmtUnixTime, FORMAT); 

    }

    

    /**

     * 将GMT日期格式化为系统默认时区的日期字符串表达形式

     * @param gmtUnixTime GTM时间戳

     * @param format 格式化字符串

     * @return 日期字符串”yyyy-MM-dd HH:mm:ss”

     * */

    public static String formatGMTUnixTime(long gmtUnixTime, String
format)

    {

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);

        return dateFormat.format(gmtUnixTime +
TimeZone.getDefault().getRawOffset()); 

    }

    

    /**

     * 获取时间穿的Date表示形式

     * @param unixTime unix时间戳

     * @return Date对象

     * */

    public static Date getDate(long unixTime)

    {  

        return new Date(unixTime);  

    }

    

    /**

     *
获取GMT时间穿的Date表示形式(转换为Date表示形式后,为系统默认时区下的辰)

     * @param gmtUnixTime GMT Unix时间戳

     * @return Date对象

     * */

    public static Date getGMTDate(long gmtUnixTime)

    {

        return new Date(gmtUnixTime +
TimeZone.getDefault().getRawOffset()); 

    }

 

    /**

     * 将系统默认时区的Unix时间戳转换为GMT Unix时间穿

     * @param unixTime unix时间戳

     * @return GMT Unix时间戳

     * */

    public static long getGMTUnixTime(long unixTime)

    {

        return unixTime – TimeZone.getDefault().getRawOffset();

    }

 

    /**

     * 将GMT Unix时间戳转换为系统默认时区的Unix时间穿

     * @param gmtUnixTime GMT Unix时间戳

     * @return 系统默认时区的Unix时间穿

     * */

    public static long getCurrentTimeZoneUnixTime(long gmtUnixTime)

    {

        return gmtUnixTime + TimeZone.getDefault().getRawOffset();

    }

    

    /**

     * 获取当前时刻之GMT Unix时间穿

     * @return 当前的GMT Unix时间戳

     * */

    public static long getGMTUnixTimeByCalendar()

    {

        Calendar calendar = Calendar.getInstance();

        // 获取当前时区下日期时对应之辰戳

        long unixTime = calendar.getTimeInMillis();

        // 获取标准格林尼治时间下日期时光对应之时间戳 

        long unixTimeGMT = unixTime –
TimeZone.getDefault().getRawOffset();

        return unixTimeGMT;

    }

    

    /**

     * 获取当前岁月的Unix时间穿

     * @return 当前的Unix时间戳

     * */

    public static long getUnixTimeByCalendar()

    {

        Calendar calendar = Calendar.getInstance();

        // 获取当前时区下日期时对应之日子穿

        long unixTime = calendar.getTimeInMillis();

        return unixTime;

    }

    

    /** 

     * 获取反时区后的光阴 

     * @param date 时间 

     * @param oldZone 旧时区 

     * @param newZone 新时区 

     * @return 时间

     */  

    public static Date changeTimeZone(Date date, TimeZone oldZone,
TimeZone newZone) 

    {  

        Date dateTmp = null;

        if (date != null)

        {

            int timeOffset = oldZone.getRawOffset() –
newZone.getRawOffset();

            dateTmp = new Date(date.getTime() – timeOffset);

        }

        return dateTmp;

    }

    

    /**

     * 将总秒数转换为时分秒表达形式

     * @param seconds 任意秒数

     * @return %s小时%s分%s秒

     */

    public static String formatTime(long seconds)

    {

        long hh = seconds / TIME_NUMBERS / TIME_NUMBERS;

        long mm = (seconds – hh * TIME_NUMBERS * TIME_NUMBERS) >
0 ? (seconds – hh * TIME_NUMBERS * TIME_NUMBERS) / TIME_NUMBERS :
0;

        long ss = seconds < TIME_NUMBERS ? seconds : seconds %
TIME_NUMBERS;

        return     (hh == 0 ? “” : (hh < 10 ? “0” + hh : hh) +
“小时”) 

                + (mm == 0 ? “” : (mm < 10 ? “0” + mm : mm) + “分”) 

                + (ss == 0 ? “” : (ss < 10 ? “0” + ss : ss) + “秒”);

    }

    

    /**

     * 获取当前日子相差指定日期时差的光景表达形式

     * @param long date 日期

     * @return 时差的约表达形式

     * */

    public static String getDiffTime(long date)

    {

        String strTime = “很漫长很久以前”;

        long time = Math.abs(new Date().getTime() – date);

        // 一分钟之内

        if(time < TIME_NUMBERS * TIME_MILLISECONDS)

        {

            strTime = “刚刚”;

        }

        else

        {

            int min = (int)(time / TIME_MILLISECONDS / TIME_NUMBERS);

            if(min < TIME_NUMBERS)

            {

                if(min < 15)

                {

                    strTime = “一刻钟前”;

                }

                else if(min < 30)

                {

                    strTime = “半小时前”;

                }

                else

                {

                    strTime = “1小时前”;

                }

            }

            else

            {

                int hh = min / TIME_NUMBERS;

                if(hh < TIME_HOURSES)

                {

                    strTime = hh + “小时前”;

                }

                else

                {

                    int days = hh / TIME_HOURSES;

                    if(days <= 6)

                    {

                        strTime = days + “天前”;

                    }

                    else

                    {

                        int weeks = days / 7;

                        if(weeks < 3)

                        {

                            strTime = weeks + “周前”;    

                        }

                    }

                }

            }

        }

        

        return strTime;

    }

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2018 亚洲必赢手机官网 版权所有