android获取年月日时分秒毫秒,Android程序中的时间

28535520eb73

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(位置:深圳南山区)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值