java - 如何在 Android 中从网络获取时间

标签 java android android-networking

在我的应用中,我想使用网络时间,而不是设备时间。我的应用程序要求时间应该是正确的。

我正在尝试从 NTS 服务器 获取时间,但加载程序一直在运行并且没有停止。我等了 30 多分钟,但仍然没有得到任何东西。

我想知道是否有任何其他方法可以从网络获取时间,因为我认为从网络获取时间不会花费太多时间。

public class MainActivity extends Activity  {

public static final String TIME_SERVER = "time-a.nist.gov";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btnGetTime = (Button)findViewById(R.id.button1);
    
     btnGetTime.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Perform action on click 
              new GetTimeFromNetwork().execute();
        }
    });

   }
    
 public class GetTimeFromNetwork extends AsyncTask<String, Void, String> {
    
    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {

        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(false);
        progressDialog.show();
        Log.i( "pre execute","yes"); 

    }


    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
    Log.i("In Get time From Server class", "yes");

           try {
                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.i("time", "Time from " + TIME_SERVER + ": " + time);
            } catch (Exception e) {
                // TODO: handle exception
                Log.e("error",e.getMessage());
         }
              return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        progressDialog.dismiss();
    
    }  }
 }

最佳答案

这个解决方案对我有用:

在你的模块中导入这个依赖(也许你已经有了):

compile 'commons-net:commons-net:3.3'

这是获取本地/网络时间的示例。如您所知,您应该像处理解决方案一样在异步任务中运行它。

public static final String TIME_SERVER = "time-a.nist.gov";

public static void printTimes() throws IOException {
            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.e("getCurrentNetworkTime", "Time from " + TIME_SERVER + ": " + time);

            Log.e("Local time", "Local time");
            Log.e("Local time", "Current time: " + new Date(System.currentTimeMillis()));
            Log.e("Local time", "Time info: " + new Date(timeInfo.getReturnTime()));
            Log.e("Local time", "GetOriginateTimeStamp: " + new Date(timeInfo.getMessage().getOriginateTimeStamp().getTime()));

            Log.e("NTP time", "Time from " + TIME_SERVER + ": " + time);

            Log.e("Local time", "Time info: " + new Date(timeInfo.getMessage().getReceiveTimeStamp().getTime()));
            Log.e("Local time", "GetOriginateTimeStamp: " + new Date(timeInfo.getMessage().getTransmitTimeStamp().getTime()));

        }

仅获取您的净时间的摘要:

public static long getNetworkTime() throws IOException {
        NTPUDPClient timeClient = new NTPUDPClient();
        InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
        TimeInfo timeInfo = timeClient.getTime(inetAddress);
        return timeInfo.getMessage().getReceiveTimeStamp().getTime();
    }

希望对您有所帮助!!

关于java - 如何在 Android 中从网络获取时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31129835/

相关文章:

java - 使用for循环访问HashSet(Java)中的所有元素?

android - Android连接WIFI后如何通过移动网络保持连接?

Android:BroadcastListner 获取错误

java - 使用 JMAP 进行堆转储时出现异常

java - 无法从 Android 中的 Firebase 存储获取下载网址

java - 从 calendar.getInstance 获取错误的日期

android - 防止 toast 消息在触摸时被取消

android - 需要有关 Android 模拟器网络的帮助

java - 如何检查上下文当前正在运行的 Activity

java - Android 搜索 View 忽略 searchHintIcon - searchHintIcon 模糊