web-dev-qa-db-ja.com

Java-システムの日付から独立した現在の日付を取得する方法?

現在の日付と時刻を知りたい。

コード

Calendar.getInstance();

プログラムが実行されているシステムの日付と時刻を表し、システムの日付が間違っている可能性があります。

だから、プログラムが実行されているシステムの日付と時刻に関係なく、正しい現在の日付と時刻を取得する方法はありますか?

17
Yatendra Goel

インターネットを使用している場合は、既知の信頼できるタイムソースを尋ねることができます。あなたのプログラムを実行している人があなたのプログラムがそれをするのを防ぎたい場合(あなたに彼らに時間制限されたライセンスを与えて、彼らがそれ以上の時間を支払いたくない場合など)、彼らはその接続をスプーフィングまたはブロックするかもしれません。

あるプロジェクトで、改ざんできないハードウェアに安全で信頼できるタイムソースを配置しました。暗号化とライセンス用に設計されており、それにアクセスするためのJavaライブラリがありました。申し訳ありませんが、デバイスの名前を思い出せません。

そのため、答えは「はい」、「いいえ」です。

4
Paul Tomblin

Java 1.1より前のバージョンでは、 Date クラスを使用することが標準でした:

Date now = new Date();     // Gets the current date and time
int year = now.getYear();  // Returns the # of years since 1900

ただし、Javaの新しいバージョンでは、Dateクラスの多くが非推奨になりました(具体的にはgetYearメソッド)。 Calendar クラスを使用することがより標準になりました。

Calendar now = Calendar.getInstance();   // Gets the current date and time
int year = now.get(Calendar.YEAR);       // The current year
41
theJollySin

私はあなたの質問を完全に理解していませんが、あなたのタイトルに答えることができます:

GregorianCalendar gc = new GregorianCalendar(System.getCurrentTimeMillis());
int year = gc.get(Calendar.YEAR);
7

システムにインターネットアクセスがありますか?その場合は、正確なタイムサービス(たとえば、 http://tldp.org/HOWTO/TimePrecision-HOWTO/ntp.html )で同期を使用し、必要に応じて許可することができます。

3
Dewfy

選択したWebサーバーからHTTP形式(通常はUTCタイムゾーン)で日付を取得するコードを次に示します。

もちろん、物理ハードウェアとOSを制御できない場合、実際に要求するWebサーバーと通信できることを保証することはできません...とにかく。

package some.package;

import Java.io.IOException;
import Java.net.URL;
import Java.net.URLConnection;
import Java.util.List;
import Java.util.Map;

public class Test {

  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://google.com";
    System.out.println(getServerHttpDate(serverUrl));
  }

}
0
Cosimo

プログラミングレベルのメソッドは、システム自体から日付と時刻を取得するために開発されています。指定されたシステム以外の日付を取得するように変更することはできません。

追加の要件で、本当に必要な場合は、クライアントマシンとサーバー間の同期が必要になります。

0
Mr.Expert