当前位置:  开发笔记 > 编程语言 > 正文

如何获得"网络"时间(来自"自动"设置,称为"使用网络提供的值"),而不是手机上的时间?

如何解决《如何获得"网络"时间(来自"自动"设置,称为"使用网络提供的值"),而不是手机上的时间?》经验,为你挑选了3个好方法。

我想在我的应用程序中找到一种方法来将日期和时间与外部源给出的内容同步.

我不想使用手机时间,因为我可能会在实时间差5分钟左右.5分钟或更少= 10分钟!

我听说过GPS卫星或网络天线的时间信息.

我已经尝试过使用System.getCurrentTime,但是我得到了设备的当前设备,因此,如果我的设备提前5分钟设置,则会显示错误的时间.

编辑

提出一个简短的问题:我怎么能得到这个时间?

在此输入图像描述



1> rds..:

我不知道,但发现这个问题很有意思.所以我挖了android代码...谢谢开源:)

你显示的屏幕是DateTimeSettings."使用网络提供的值"复选框与共享首选项相关联String KEY_AUTO_TIME = "auto_time";,也与Settings.System.AUTO_TIME

这个设置是由mAutoTimeObserver2个网络中ServiceStateTracker的被观察者观察到的: GsmServiceStateTrackerCdmaServiceStateTracker.

两种实现都调用revertToNitz()设置变为true时调用的方法.显然,NITZ相当于运营商世界的NTP.

底线:您可以将时间设置为运营商提供的价值,这要归功于revertToNitz().不幸的是,我还没有找到一种机制来获取网络时间.如果你真的需要这样做,我担心,你将不得不复制这些ServiceStateTracker实现,捕获框架提出的意图(我想),并添加一个getter mSavedTime.


好的,所以简短的回答是......我永远无法做到这一点:-p.非常感谢您花费的时间并享受赏金!

2> pretty angel..:

从http://commons.apache.org/net/download_net.cgi获取库

//NTP server list: http://tf.nist.gov/tf-cgi/servers.cgi
public static final String TIME_SERVER = "time-a.nist.gov";

public static long getCurrentNetworkTime() {
    NTPUDPClient timeClient = new NTPUDPClient();
    InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
    TimeInfo timeInfo = timeClient.getTime(inetAddress);
    //long returnTime = timeInfo.getReturnTime();   //local device time
    long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();   //server time

    Date time = new Date(returnTime);
    Log.d(TAG, "Time from " + TIME_SERVER + ": " + time);

    return returnTime;
}

getReturnTime()与System.currentTimeMillis()相同.

应该使用getReceiveTimeStamp()或getTransmitTimeStamp()方法.

将系统时间设置为1小时后,您可以看到差异.

local time :
System.currentTimeMillis()
timeInfo.getReturnTime()
timeInfo.getMessage().getOriginateTimeStamp().getTime()

NTP server time :
timeInfo.getMessage().getReceiveTimeStamp().getTime()
timeInfo.getMessage().getTransmitTimeStamp().getTime()


这是一个有用的答案,但这需要一个互联网连接,这不是Android设置中使用的网络时间的情况

3> Sunit Kumar ..:

试试这段代码:

String timeSettings = android.provider.Settings.System.getString(
                this.getContentResolver(),
                android.provider.Settings.System.AUTO_TIME);
        if (timeSettings.contentEquals("0")) {
            android.provider.Settings.System.putString(
                    this.getContentResolver(),
                    android.provider.Settings.System.AUTO_TIME, "1");
        }
        Date now = new Date(System.currentTimeMillis());
        Log.d("Date", now.toString());

确保在Manifest中添加权限



这不再适用.至于API级别18及以上,"System.AUTO_TIME"被移动到"Global.AUTO_TIME"并访问我们需要"WRITE_SECURE_SETTINGS"权限,该权限只能由系统应用程序访问.
这不是解决方案,请参阅代码 - 它只是打开AUTO_TIME,但系统需要一些时间来同步当前时间.此外,用户可能不希望这种自动时间.例如,我的时区有一个错误,它显示+1小时的时间.
推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有