相信很多人看到过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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐