您的位置:首页 > 移动开发 > Android开发

如何修改Android系统默认时间

2017-09-23 17:06 1031 查看
相信很多人看到过Android手机或平板显示XXXX-01-01这个奇怪的日期,没错,这就是Android设备的默认日期。当Android设备没有联网,无法获取当前真实时间的时候,就会使用系统默认时间。大部分时候,系统默认时间是Epoch时间(即1970-01-01 00:00:00 UTC),也有OEM厂商会修改此默认时间。

进入正题,如何修改默认时间呢,很简单,修改SystemServer.java中EARLIEST_SUPPORTED_TIME常量的值。如下:

private void run() {
try {
traceBeginAndSlog("InitBeforeStartServices");
// If a device's clock is before 1970 (before 0), a lot of
// APIs crash dealing with negative numbers, notably
// java.io.File#setLastModified, so instead we fake it and
// hope that time from cell towers or NTP fixes it shortly.
if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
Slog.w(TAG, "System clock is before 1970; setting to 1970.");
SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
}
// ......
}


好了,知道了修改EARLIEST_SUPPORTED_TIME可以改变系统默认时间,还得知道怎么样修改EARLIEST_SUPPORTED_TIME呀。如果我需要把默认时间改为2016-01-01 00:00 UTC,那EARLIEST_SUPPORTED_TIME应该为什么数呢?

EARLIEST_SUPPORTED_TIME表示的是从Epoch开始所经历的毫秒数,回想一下,UNIX时间戳表示的是从Epoch开始所经历的秒数。也就是说,我们只需要把某个具体时间转换为UNIX时间戳,进而就可以转换为EARLIEST_SUPPORTED_TIME值了。

怎么把某个时间转换为UNIX时间戳呢,不少人编程去做,其实大可不必如此麻烦,Linux的date命令就可以完成这个转换。如下:

$ date +%s --date 19700101 --utc   // 1970-01-01 00:00 UTC
0
$ date +%s --date 20120101 --utc   // 2012-01-01 00:00 UTC
1325376000
$ date +%s --date 20160101 --utc   // 2016-01-01 00:00 UTC
1451606400


反之,也可以把某个UNIX时间戳转换为具体日期,如下:

$ date --date=@86400 --utc // Android默认EARLIEST_SUPPORTED_TIME值为86400×1000
1970年 01月 02日 星期五 00:00:00 UTC
$ date --date=@1451606400 --utc
2016年 01月 01日 星期五 00:00:00 UTC
$ date --date=@1451606400
2016年 01月 01日 星期五 08:00:00 CST


注:frameworks/base/services/java/com/android/server/SystemServer.java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android