Am/Pm,日期格式,日期字串客制化


一、时间格式

时间的小时制分为12小时制和24小时制。由于一天是24小时,如果是12小时制必须把一天分为2段,为了区分当前时间是哪一段,因此在显示上必须加上一个标记。一般是凌晨开始到中午是一个时间段叫做上午(am),下一个时间段就是下午(pm).比如上午8点、下午2点。

在Android时间显示上每种语言默认时间格式不同,标记时间段的翻译也不同。比如英文默认是24小时制,时间段使用am、pm;中文默认是12小时制,时间段使用上午、下午。

这些都是在ICU里面定义的,具体定义在external\icu4c\data\locales\xx.txt(xx是语言代码,ISO_639-1),找到gregorian部分,如波斯fa.txt中定义
gregorian{
AmPmMarkers{
     "قبل‌ازظهر",----->am
"
بعدازظهر",-----àpm
}
DateTimePatterns{
"H:mm:ss (zzzz)",----àH代表24小时制,h代表12小时制
"H:mm:ss (z)",
"H:mm:ss",
"H:mm",
……

AmPmMarkers这个就是定义时间段字串,H:mm是时间格式显示,对于其他语言比如印尼语显示为H.mm如果要修改时间段、小时制或者显示格式,可以在此处修改。注意修改ICU资源需要单独编译ICU资源,在new整个工程,否则不会其效果。

二、日期格式

日期显示多种多样,有的带有年份,有的没有,有的月份是全称,有的是简写,比如下拉通知栏日期显示为:TUE,JANUARY 1 Setting里面日期显示为:2013 Jan 1,Tue

如何控制这些显示模式、以及这些子串在那定义呢?

一般日期显示会实例化一个Date Format实例,这个实例在format需要三个参数,一个时间,一个是Locale(指定使用那个语言字串串,默认是系统语言),另一个就是显示模式了(format string).

如下例子:

  1. long time = SystemClock.currentThreadTimeMillis();
  2. SimpleDateFormat shortDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm, EE",new Locale(“zh”));
  3. String sDate = shortDateFormat.format(new Date(time));
  4. textView.setText(sDate);

几点说明:

1) 年、月、星期是简写还是全部显示,有对应字母个数决定,如:

  • yyyy年份全称,yy是简写,2010,10
  • MMMM显示全称,MMM简写,MM阿拉伯数字全称,M阿拉伯数字简称January,Jan,01,1
  • EEEE 星期的全称,EE 星期的简称Tuesday, Tue
  • dd 日的全称,d日的简称01, 1

2) 上述这些月、星期的字串也是定义在ICU的locale里面各个语言资源文件中。

手机时间、夏令时及Android时间更新方式


一、时间

时间是指世界的时间,是对某一时刻的表示。手机系统的时间,通常是在状态栏、锁屏界面等表现给用户,让用户知道现在是什么时间。时间分为标准时间和夏令时时间,标准时间是指正常的时间,夏令时是指满足特定区域的需求,人为的将时间往前调一个小时,如下面的介绍。

二、夏令时

夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个国家具体夏令时规定不同。比如美国芝加哥时区夏时制开始时间:2014-3-9 2:00:00夏时制结束时间:2014-11-2 2:00:00;俄罗斯从2014年10月26日起取消自2011年开始使用的夏令时,转变为“冬季时间”,未来也不再使用冬夏时制转换。

如果发现系统时区和预想的时区或者当地时区相差一个小时原因可能是夏令时制的问题:

可以通过下面2中方法确认:

1、可以网上查询该时区是否有夏令时,然后查看当前的系统时间是否在此时区的夏令时执行时间段内。

2、调整手机系统日期,看看时区时差是否有变化。比如手机时区为芝加哥时区,系统时间为8月15日,显示GMT:-5,如果系统时间调整为12月1日,将会显示GMT:-6。

三、Android时间、时区更新方式

在目前Android版本,通过网络同步时间有两种方式:NITZ和NTP。NITZ是否支持取决于SIM的运行商,目前国内运行商还不支持。NTP是通过网络获取网络时间,只要手机可以正常联网就可以更新时间。

下面是这两种更新方式的对比:

  NITZ NTP
可同步时间 Y Y
可同步时区 Y N
必备条件 插入SIM卡且运行商持 可访问互联网
同步对象 运营商基站 NTP Server

如果勾选Setting里面的自动更新时间没有效果:

说明通过NITZ和NTP方式都无法更新时间,一般来说是在运营商不支持NITZ,或者网络状况有问题时发生,比如手机没有连上WIFI或GPRS,不能访问互联网,或者手机网络访问NTP server延时太大,或者NTP server地址配置不正确等。

1、如何验证运营商是否支持NITZ消息呢?

可以使用该SIM卡在对比机中测试,如果对比机也无法更新时间,说明,此卡运营商不支持nitz消息。

2、如何确认是手机是否可以正常访问互联网

可以打开一个网页,看看是否可以正常打开。

如果sim运行商支持NITZ消息或者手机可以正常联网,还是无法更新时间,需要根据log分析具体的原因,如何分析可以参考问题分析模块

需要注意的是NTP只更新时间,不会更新时区。