【问题标题】:How to get time from Network in Android如何在 Android 中从网络中获取时间
【发布时间】:2015-09-16 18:02:46
【问题描述】:

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

我正在尝试从 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();

    }  }
 }

【问题讨论】:

  • Log.i("time", "Time from " + TIME_SERVER + ": " + time);
  • 不,我什么都没有。
  • 换个时间服务器试试
  • 你在使用stackoverflow.com/questions/4442192/…这个链接然后检查有没有时间服务器列表

标签: java android android-networking


【解决方案1】:

这个解决方案对我有用:

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

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();
    }

希望对你有帮助!!

【讨论】:

  • 这段代码有什么变化?和我的一模一样
  • 请告诉我一件事,此代码适用于 2G 和 3G?
  • 没有重要的变化,但有时处理不好的异常或类似的事情会让你发疯。我给了你一个对我有用的例子,以防你只想复制和粘贴来证明。恐怕我没有检查它是否适用于2G和3G,但检查一下。为了使其正常工作,我建议您使用 Wifi 或 4G 进行测试,因为我可以保证它适用于它们。
  • 娟哪里写抛出IO异常?主要活动还是做背景?
  • 我会尽快在您的电话订单中找到它。在这种情况下,en doinbackground。在那里,使用你的“Log.e .....”。为方便起见,请仅在您的 logcat 中过滤错误。也许它正在打印但隐藏其他消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2011-04-01
  • 2011-10-31
  • 2012-11-24
相关资源
最近更新 更多