搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
花生_TL007
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
android根文件系统目录结构_java安卓插入usb的根目录是什么
2
鸿蒙HarmonyOS应用开发:环境配置_鸿蒙应用开发gradle同步一下
3
中国AI行业简介_ai业
4
区块链先锋丨让更多开发者使用sCrypt在BSV区块链上进行构建_bsv script
5
SpringBoot+VUE民宿管理系统后台-毕业设计-【JSB项目实战】
6
2024年AIGC发展现状
7
三个matlab练习程序 -Moravec算子- 各向异性扩散- TV模型图像修复_moravec算子计算例题
8
由于找不到msvcr100.dll,msvcr100.dll丢失怎样修复_由于找不到msvcr100.dll,无法继续执行代码什么意思
9
angular 全局监听键盘事件
10
OpenHarmony/HarmonyOS三方库使用指导_ohpm三方库的包依赖在
当前位置:
article
> 正文
Android中关于日期时间与时区的使用总结_安卓标准时区utc
作者:花生_TL007 | 2024-03-23 11:17:36
赞
踩
安卓标准时区utc
在开发
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;
}
}
from:http://www.2cto.com/kf/201312/266908.html
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/花生_TL007/article/detail/294884
推荐阅读
article
[
Android
]解决运行时错误:
INSTALL
_
FAILED
_
UPDATE
_
INCOMPATIBL...
首先,出现这个错误,大多数情况下应该是系统没有卸载干净,如果可以在系统设置里面找到应用进行卸载的话,则卸载掉重新运行。不...
赞
踩
article
android--解决这个问题:INSTALL_FAILED_UPDATE_INCOMPATIBLE...
原因:有一个demo之前做过,所以把apk直接push到data\app下面,,后面再开发一个同包名的demo,,结果安...
赞
踩
article
Android: INSTALL_FAILED_UPDATE_INCOMPATIBLE错误解决措施_...
晚上在测一个widget,前面测的好好的,后面再安装的时候发现如下错误:[2009-06-07 02:39:35 - b...
赞
踩
article
Android
Update
Engine
分析(十一) 更新
payload
签名_
bl
updat...
上一篇《
Android
Update
Engine
分析(十)生成
payload
和 metadata 的哈希》详细分...
赞
踩
article
Android
OTA
相关工具(四) 查看
payload
文件信息_
android
payloa...
一直以来,很多人都表达过很想去研究一下
Android
OTA
的
payload
文件,看看里面到底有什么,想对其进行...
赞
踩
article
RK3568
Android 11添加
EC20
模块的GPS功能_
rk3568
移植
gps
/
gnss
...
RK3568
Android 11添加
EC20
模块的GPS功能_
rk3568
移植
gps
/
gnss
模组
rk3568
...
赞
踩
article
RK3566
ANDROID 11 平台上适配移远
EC200A
_
配置
config
_
usb
_
seria...
4.查看一下AT命令集,善于捕捉ril log,熟练使用 logcat -b radio,移远方案,可以通过创建文件。3...
赞
踩
article
(部分翻译)AI
Benchmark
:
Running
Deep
Neural
Networks
o...
移动端机器学习硬件加速乱象虽然第一台消费级电脑大多配备了单独的独立CPU,但很快人们就发现它的计算性能对于许多多媒体应用...
赞
踩
article
rk3288
android
7.1
EC20CE
调试记录_
rk3288
调试
ec20
...
一、RIL Android 系统框架如下图所示二、调试
EC20CE
主要是修改 LINUX KERNEL 和 Librar...
赞
踩
article
android
移植
4G 模块调试记录
_
android
的
4g
移植
...
https://blog.csdn.net/u010164190/article/details/79096345
_
an...
赞
踩
article
android
7.1
RIL
获取
SIM卡
号_
requestsim
_io
error
...
平台RK3288 + Android 7.1 + EC20流程获取手机号代码: TelephonyManager te...
赞
踩
article
AI
on
Android
:安卓
平台
上
的
人工智能
应用实战(01.环境
的
搭建)_
android
部署人...
AI
on
Android
:安卓
平台
上
的
人工智能
应用实战(01.环境
的
搭建)
人工智能
可以说是近些年来最热门
的
词汇之一,可...
赞
踩
article
手把手
教你
在
Android
上搭建
tensorflow
Lite2.0_
tensorflow
andr...
背景人工智能火了,
tensorflow
也火了,Google推出移动版的TensorFlow Lite,目标就是能够
在
移...
赞
踩
article
ERROR: The m
in
Sdk version should not be
decl
are
d i...
这里写自定义目录标题新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的...
赞
踩
article
Android
人工智能
的新基石:
Gemini
Nano
和
AICore
...
原文地址:https://android-developers.googleblog.com/2023/12/a-new...
赞
踩
article
Android
C++
服务
创建
和
HIDL
的生成_
framework
如何新增
hidl
服务
...
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录
Android
C++
服务
创建
和
HIDL
的生成一...
赞
踩
article
AI
Core
带来了
Android
专属
的
AI
能力
,它要解决什么?采用什么架构思路?_andr...
Google 最近发布
的
Gemini模型在全球引起了巨大反响,其在多模态领域
的
Video demo 无比震撼。对于 A...
赞
踩
article
万字盘点
Android
领域在 2023 年的重要技术:
AI
, 14,
Compose
, 鸿蒙.....
在LLM
AI
GC大浪潮下作为
AI
先驱的 Google 想在存量最大的
Android
生态里做点延伸即
AI
Core,...
赞
踩
article
【
AI
】
Android
Pie
中引入
的
AI
功能
盘点...
前言 “无
AI
,不未来”,绝对不是一句豪情壮语,
AI
早已进入到了我们生活当中。去年Google发布
的
Android
Pi...
赞
踩
article
Android
studio
将
语音
识别接入AI_
android
ai
语音
助手
开发...
本文章主要实现的功能和作用,当然此小艺非彼小艺(低配)。_
android
ai
语音
助手
开发
android
ai
语音
助手
开...
赞
踩
相关标签
android
shell
cmd
INCOMPATIB
application
数据库
output
文档
update engine
ota
payload
Android A/B 系统
动态分区
虚拟 A/B
移动端
深度学习
RIL
SIM卡号
手机号码
TelephonyManager
人工智能
Android
tensorflow
AI