在 Android 上更改与取得系统时区及时间


最近正在写一个世界时钟的程式,期间遇到几个问题,花了好些功夫,还是没有得到满意的答案。分享出来,给其他遇到相似问题的网友,也看看有谁知道答案的。

取得系统时间

要得到目前的时间,这个倒是很容易,就是 System.currentTimeMillis()。不过要注意的是,这个函式传回的是 UTC (GMT) 这个时区的时间,像台湾所在的时区是 UTC+8,你得将这个函式所传回的值再加 8 个小时,才是你要的答案。实际上,当然不用自己加,你可以借用 Calendar 这个类别来帮你。

更改系统时间

要更改系统的时间,这可就难倒我了。在 m5 SDK 上,用 SystemClock.setCurrentTimeMillis(),虽然会有警告讯息,不过系统时间还是会被更改。到了 v0.9 SDK,这招就没效了。扫过 Android 的原始程式,他们的确是用这个函式在更改系统时间。可是在我的程式里,不管我加了那些 permission,都是给我个 Permission denied 错误。最好,只好在 这里 发文问了这个问题,有个应该是 Google 的工程师,给了下面这个答案。

User apps cannot set the time. Only the system processes can. This is for security, but also because it won't have much effect--the time is reset from the radio via network time.

看了,要在 application 这一层更改系统时间,应该是没解了。如果有人知道其他答案的,帮忙解答一下。

取得与更改系统时区

用 TimeZone.getDefault() 就可以取得当前的时区,如果你没有特别设定的话,那你取到的,都是 GMT 这个时区。看起来,至少在 Windows 平台上, Android Emulator 还是不会正确决定当前的时区。目前我知道的唯一方法就是,在启动 Emulator 的参数上,加上 -timezone "Asia/Taipei"。透过启动 Emulator 的参数可以更改时区,那可以透过 API 来更改系统时区吗?我试过 TimeZone.setDefault(TimeZone.getTimeZone("Asia/Taipei")),也用过 System.setProperty("user.timezone", "Asia/Taipei"),没一个有效。所以看起来,也暂时无解。有谁知道如何透过 API 更改系统时区?

相关内容