微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 如何在android时区data中新增一个时区

如何在android时区data中新增一个时区

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
android的时区信息主要在定义tzdata和ICU的一些文件中,由于各个国家的时区规则又是不固定的,比如俄罗斯在2014年10月26日之后
把时区从9个新增到11个,这样一来Android的时区data也要做更新 , 下面就以俄罗斯新增的一个时区Srednekolymsk为例详细描述如何
添加一个时区。
[SOLUTION]
一、修改tzdata
1、 在网址ftp://ftp.iana.org/tz/releases/下载tzdata*.tar.gz
1) 下载2013H版本(KK默认使用的是这个版本)作为编译版本。
2) 下载2014E或者以后的版本作为参考版本(俄罗斯时区在这个版本以后才更新)
2、 修改时区文件
分别解压2013H版本和2014E版本的下载包,打开 europe文件,在2014e的版本Europe文件中搜索Srednekolymsk关键字,可以找到
Srednekolymsk的相关的定义,如下
Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
10:00 - MAGT 1930 Jun 21 # Magadan Time
11:00 Russia MAG%sT 1991 Mar 31 2:00s
10:00 Russia MAG%sT 1992 Jan 19 2:00s
11:00 Russia MAG%sT 2011 Mar 27 2:00s
12:00 - MAGT 2014 Oct 26 2:00s
11:00 - SRET # Srednekolymsk Time
然后把此段新增到2013H的europe文件中
3、 将修改后的2013H打包并拷贝到\bionic\libc\tools\zoneinfo目录下。
4、 在bionic\libc\tools\zoneinfo\新建py文件,如update_tzdata_local.py,拷贝附录1的脚本。
5、 需要修改相关版本信息,和网站下载版本号保持一致,比如
- new_version = "tzdata2013h"
- filename = "tzdata2013h.tar.gz"
- current_version = "tzdata2013h"
6、 执行这个python update_tzdata_local.py
7、 如果bionic\libc\tools\zoneinfo\有 extracted、data 2个文件夹存在, 需要删除,否则会报错。如果还是报错,请换台计算机在尝试。
8、 出现下面的log说明执行ok
……
.Calling zic(1)...
Calling ZoneCompactor to update bionic to tzdata2013h...
You already have the latest tzdata (tzdata2013h)!
执行完成后bionic\libc\zoneinfo\tzdata文件会更新。
二、修改ICU资源
下面的这些信息可以在网上下载最新的ICU信息,对比修改。
1、zoneinfo64
修改的文件是
Android KKexternal\icu4c\data\misc \zoneinfo64.txt,
AndroidLexternal\icu\icu4c\data\misc \zoneinfo64.txt,
主要有3处
1)在Zones:array处添加table信息
/* Asia/Singapore */ :table {
trans:intvector { -2038200925, -1167634800, -1073028000, -894180000, -
879665400, -767005200, 378664200 }
typeOffsets:intvector { 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000,
0, 28800, 0, 32400, 0 }
typeMap:bin { "01020304060405" }
links:intvector { 310, 589 }
} //Z#310
/* Asia/Srednekolymsk */ :table {
trans:intvector { -1441188892, -1247565600, 354891600, 370699200,
386427600, 402235200, 417963600, 433771200, 449586000, 465318000,
481042800, 496767600, 512492400, 528217200, 543942000, 559666800,
575391600, 591116400, 606841200, 622566000, 638290800, 654620400,
670345200, 686073600, 695750400, 701784000, 717505200, 733244400,
748969200, 764694000, 780418800, 796143600, 811868400, 828198000,
846342000, 859647600, 877791600, 891097200, 909241200, 922546800,
941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400,
1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200,
1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800,
1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600,
1414245600 }
typeOffsets:intvector { 36892, 0, 36000, 0, 36000, 3600, 39600, 0, 39600,
3600, 43200, 0 }
typeMap:bin {
"0103040304030403040304030403040304030403040302010304030403040304030403040
304030403040304030403040304030403040304030403040304030503" }
} //Z#310+1
注意这个文件的时区都是按照顺序添加的,如这次是添加到Singapore的后面位置是311
2)在Names中时区ID
注意添加位置要和上面的保持一致
,"Asia/Singapore",Asia/Srednekolymsk
,"Asia/Taipei","Asia/Tashkent","Asia/Tbilisi" // 313+1
3)在rules中添加对应的信息
不是所有的时区添加这条,只有在Zones:array的table中有用的才添加,如Africa/Windhoek这个时区有用到Namibia
/* Africa/Windhoek */ :table {
……
finalRule { "Namibia" }
……
} //Z#58
Namibia:intvector {
8, 1, -1, 7200, 0, 3, 1, -1, 7200, 0, 3600
} //_#23
Srednekolymsk这个时区没有用到,不用添加
4)在Regions:array添加时区的iso国家代码
Srednekolymsk的是俄罗斯的时区,俄罗斯的代码是RU,具体代码查询可以参考
http://zh.wikipedia.org/wiki/ISO_3166-1
注意添加的位置要和1、2步骤保持一致。
Regions:array {
"SG", //Z#310 Asia/Singapore
"RU", //Z#310+1 Asia/Srednekolymsk
2、metaZones
修改的文件是
Android KK external\icu4c\data\misc \ metaZones.txt,
AndroidL external\icu\icu4c\data\misc \ metaZones.txt,
修改的地方有2处
1)metazoneInfo中新增如下文字
"Asia:Srednekolymsk"{
{
"Magadan",
"1970-01-01 00:00",
"2014-10-25 14:00",
}
}
2)mapTimezones在对应的地添加时区映射
如知道Srednekolymsk使用的是这个Magadan标记,就在Magadan添加如下红色字体一行
Magadan{
001{"Asia/Magadan"}
RU{"Asia/Srednekolymsk"}
}
当然如果没有对应的映射,可以新建一个,如下:
Srednekolymsk {
001{"Asia/Srednekolymsk"}
}
3、添加映射对应的名称
Android KK external\icu4c\data\zone\xx.txt,xx
AndroidLexternal\icu\icu4c\data\zone\xx.txt,xx
是对应语言的代码,具体语言代码可以参考http://zh.wikipedia.org/wiki/ISO_639-1。如中文的为zh.txt
,可以看到zh.txt中是有Magadan这一个映射的定义的。
"meta:Magadan"{
ld{"马加丹夏令时间"}
lg{"马加丹时间"}
ls{"马加丹标准时间"}
}
如果是新增一个的话(要和mapTimezones中的对应),可以添加如下
"meta: Srednekolymsk "{
ld{"马加丹夏令时间"}
lg{"马加丹时间"}
ls{"马加丹标准时间"}
}
4、timezoneTypes
在Andoid KK external\icu4c\data\misc \ timezoneTypes.txtd
AndroidL external\icu4c\data\misc \ timezoneTypes.txt
中的typeMap新增一行
"Asia:Srednekolymsk"{"rusred"}
修改完要参考FAQ04011重新编译ICU资源,否则直接编译工程不会有效果。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top