как заставить мое приложение Java получать глобальное время от некоторых онлайн часов - PullRequest
5 голосов
/ 24 марта 2010

Я делаю распределенное Java-приложение, для которого мне нужно, чтобы обе части приложения работали в одно стандартное время. Поскольку системное время может быть разным, я подумал, содержит ли java API некоторый класс для загрузки времени из стандартного онлайн-источника?

Ответы [ 5 ]

6 голосов
/ 24 марта 2010

Вам необходимо использовать NTP (сетевой протокол времени):

http://en.wikipedia.org/wiki/Network_Time_Protocol

Следующая ссылка содержит некоторый справочный код клиента NTP Java для взаимодействия с сервером NTP:

http://psp2.ntp.org/bin/view/Support/JavaSntpClient

3 голосов
/ 25 ноября 2012

Вот код, который я нашел где-то еще ... и я его использую. для этого используется библиотека Apache Commons.

// List of time servers: http://tf.nist.gov/service/time-servers.html

   import java.net.InetAddress;
   import java.util.Date;
   import org.apache.commons.net.ntp.NTPUDPClient;
   import org.apache.commons.net.ntp.TimeInfo;

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

public static void main(String[] args) throws Exception {
    NTPUDPClient timeClient = new NTPUDPClient();
    InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
    TimeInfo timeInfo = timeClient.getTime(inetAddress);
    long returnTime = timeInfo.getReturnTime();
    Date time = new Date(returnTime);
    System.out.println("Time from " + TIME_SERVER + ": " + time);
}
}
1 голос
/ 06 октября 2013

Спасибо Rajendra_Prasad, это правда

public static void main(String[] args) throws Exception {
        NTPUDPClient timeClient = new NTPUDPClient();
        InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
        TimeInfo timeInfo = timeClient.getTime(inetAddress);
        long returnTime = timeInfo.getReturnTime();
        Date time = new Date(returnTime);
        long systemtime = System.currentTimeMillis();
        timeInfo.computeDetails();
        Date realdate = new Date(systemtime + timeInfo.getOffset());
        System.out.println("Time from " + TIME_SERVER + ": " + time);
        System.out.println("Time from " + TIME_SERVER + ": " + realdate);
        System.out.println(""+time.getTime());
    }
1 голос
/ 18 апреля 2013

обратите внимание .... timeInfo.getReturnTime() не возвращает текущее время из timeserver.он возвращает местное время, когда был сделан запрос к server.

после вызова timeInfo.computeDetails() возможно получить смещение на timeInfo.getOffset()., это возвращает смещение местного времени в миллисекундах.

для расчета текущего времени вы можете сделать что-то вроде:

...
long systemtime = System.currentTimeMillis();
Date realdate = new Date(systemtime + timeInfo.getOffset());
...
0 голосов
/ 25 июля 2018
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;


public class TimeValidationHook {

  private static String getServerHttpDate(String serverUrl) throws IOException {
    URL url = new URL(serverUrl);
    URLConnection connection = url.openConnection();

    Map<String, List<String>> httpHeaders = connection.getHeaderFields();

    for (Map.Entry<String, List<String>> entry : httpHeaders.entrySet()) {
      String headerName = entry.getKey();
      if (headerName != null && headerName.equalsIgnoreCase("date")) {
        return entry.getValue().get(0);
      }
    }
    return null;
  }

  public static void main(String[] args) throws IOException {

    String serverUrl = args.length > 0 ? args[0] : "https://www.google.co.in";
    System.out.println(getServerHttpDate(serverUrl));
    Timestamp ts = new Timestamp(System.currentTimeMillis());
    System.out.println(ts);

//formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US)    Tue, 24 Jul 2018 13:25:37 GMT
    SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);

    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
    Date date2 = null;
    Date date1 = null;
        try
        {
            date1. = sdf.parse(getServerHttpDate(serverUrl));
            date2 = sdf2.parse(ts.toString());
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }

        System.out.println("date1 : " + sdf2.format(date1));
    System.out.println("date2 : " + sdf2.format(date2));

    if (date1.compareTo(date2) > 0) {
        System.out.println("Date1 is after Date2"); 

        List<String> cmd = new ArrayList<String>();
        cmd.add("hg rollback");
        ProcessBuilder pb = new ProcessBuilder(cmd);
        pb.directory(new File("E:\\repos\\Trunk"));
        Process p = pb.start();
    } else if (date1.compareTo(date2) < 0) {
        System.out.println("Date1 is before Date2");
    } else if (date1.compareTo(date2) == 0) {
        System.out.println("Date1 is equal to Date2");
    } else {
        System.out.println("How to get here?");
    }

  }



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...