Android 通过NTP服务器自动获取时间的方法 您所在的位置:网站首页 安卓获取时区 Android 通过NTP服务器自动获取时间的方法

Android 通过NTP服务器自动获取时间的方法

2023-09-19 07:33| 来源: 网络整理| 查看: 265

        对于手机,如果有SIM卡支持的话,在设置时间时可以通过选择自动从网络获取时间来取得当地的时间和时区。

        但如果手机没有SIM卡,此时如果有Wifi链接,手机依然可以通过网络自动获取时间(时区此时需要手动设置)。 查看Android源码,在android.net 中有 SntpClient类,可以通过访问NTP服务器来取得当前的GMT时间。pool.ntp.org为最常用的一个NTF服务器。修改SntpClient代码,你也可以在自己的应用(包括非Android应用)中通过NTP服务器来取得当前GMT时间,代码如下:

public class SntpClient{ private static final int ORIGINATE_TIME_OFFSET = 24; private static final int RECEIVE_TIME_OFFSET = 32; private static final int TRANSMIT_TIME_OFFSET = 40; private static final int NTP_PACKET_SIZE = 48; private static final int NTP_PORT = 123; private static final int NTP_MODE_CLIENT = 3; private static final int NTP_VERSION = 3; // Number of seconds between Jan 1, 1900 and Jan 1, 1970 // 70 years plus 17 leap days private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L; // system time computed from NTP server response private long mNtpTime; // value of SystemClock.elapsedRealtime() corresponding to mNtpTime private long mNtpTimeReference; // round trip time in milliseconds private long mRoundTripTime; public boolean requestTime(String host, int timeout) { try { DatagramSocket socket = new DatagramSocket(); socket.setSoTimeout(timeout); InetAddress address = InetAddress.getByName(host); byte[] buffer = new byte[NTP_PACKET_SIZE]; DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT); // set mode = 3 (client) and version = 3 // mode is in low 3 bits of first byte // version is in bits 3-5 of first byte buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION 16); buffer[offset++] = (byte) (seconds >> 8); buffer[offset++] = (byte) (seconds >> 0); long fraction = milliseconds * 0x100000000L / 1000L; // write fraction in big endian format buffer[offset++] = (byte) (fraction >> 24); buffer[offset++] = (byte) (fraction >> 16); buffer[offset++] = (byte) (fraction >> 8); // low order bits should be random data buffer[offset++] = (byte) (Math.random() * 255.0); } } SntpClient client = new SntpClient(); if (client.requestTime("pool.ntp.org", 10000)) { long now = client.getNtpTime() + System.nanoTime() / 1000 - client.getNtpTimeReference(); Date current = new Date(now);// GMT TIME //current.s //System.out.println(current.toString()); LogUtil.i("NtpTime " + current.toString()); }

 

调用以上方法,可以得到当前GMT时间。 ———————————————— 参考连接:https://blog.csdn.net/qq_43685118/article/details/87090487



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有