Javaで現在の日時をUTCまたはGMTで取得するにはどうすればよいですか?


479

新しいDateオブジェクトを作成すると、現在の時間にローカルタイムゾーンで初期化されます。現在の日時をGMTで取得するにはどうすればよいですか?


これらのタイプのトピックが完全に議論されていることは知っていますが、commons-langパッケージはこれらの一般的なJavaの問題を本当にうまく処理していることがわかりました。commons.apache.org/lang/api-2.5/org/apache/commons/lang/time彼らが持っているさまざまなパッケージをチェックしてください。

希望する現地時間と精度。ほとんどのタイムゾーンはUTCに対して相対的に定義され、SI秒単位で測定される固定オフセットがありますが、太陽観測と(わずかに)可変長の秒に基づくGMTの関係はより複雑です。2つは最大0.9秒まで異なります。
mc0e 2017

1
AはDateそう、タイムゾーンを保持「が、ローカルタイムゾーンでは」(最高で、または不正確な)正しくないしませんを参照してください。すべてのjava.util.Dateについて
オレVV

回答:


409

java.util.Date特定のタイムゾーンはありませんが、その値は最も一般的にUTCに関連して考えられます。現地時間だと思うのはなぜですか?

正確にjava.util.Dateは、a内の値は、1970年1月1日深夜UTCで発生したUnixエポックからのミリ秒数です。同じエポックは他のタイムゾーンでも説明できますが、従来の説明ではUTCが使用されています。固定のエポックからのミリ秒数であるため、java.util.Dateローカルタイムゾーンに関係なく、特定の瞬間の内部の値は世界中で同じです。

問題は、ローカルタイムゾーンを使用するCalendarのインスタンス、またはローカルタイムゾーンDate.toString()も使用するCalendarのインスタンス、またはSimpleDateFormatデフォルトでローカルタイムゾーンも使用するインスタンスを介して表示していることだと思います。

これが問題でない場合は、サンプルコードを投稿してください。

ただし、とにかく、より明確なAPIを提供するJoda-Timeを使用することをお勧めします。


5
次に、それはおそらくドライバーの問題です。接続をUTCなどに設定する必要がある場合があります。以前にこのような問題を見たことがありますが、問題はjava.util.Dateにはありません。
Jon Skeet、

13
Behrang、stackoverflow.com / questions / 4123534 /…によれば、MySQL JDBCドライバーは指定されたjava.util.Timestamp(またはjava.util.Date)をサーバーのタイムゾーンに変換します。
Derek Mahar、

5
@氏。猫:どうやってそれを決めているの?書いてSystem.out.println(new Date())ますか?もしそうなら、toString()それはそこにタイムゾーンを適用している方法であることに注意する必要があります...そうでない場合は、詳細を教えてください。
Jon Skeet

8
@KanagaveluSugumar:toString()常にデフォルトのタイムゾーンを使用します。date.getTime()間違いなく、Unixエポックからのミリ秒をUTCで返します。それDate自体はタイムゾーンをまったく持たないと言うのが最も正確です。それは単なる瞬間であり、複数のタイムゾーンで見なされる可能性があります。ただし、インスタンスを作成するときは、タイムゾーンに依存しません
Jon Skeet、

6
@Jemenake:英国は当時UTC + 1だったので、実際にはグリニッジの真夜中には起こりませんでした。歴史のほんの一部です。しかし、私はあなたの要点を理解します-「new Date()。getTime()は、Unixエポックからのミリ秒を返します。これは、1970年1月1日、UTCの真夜中だった」です。したがって、UTCはエポックを特定の時点に固定することの一部であり、結果の一部ではありません。
Jon Skeet、2013年

324

tl; dr

Instant.now()   // Capture the current moment in UTC. 

その値を表す文字列を生成します。

Instant.now().toString()  

2016-09-13T23:30:52.123Z

細部

ジョンスキートによって正解述べ、java.util.Dateオブジェクトが持っていないタイムゾーンを。ただし、そのtoString実装では、その日時値の文字列表現を生成するときに、JVMのデフォルトのタイムゾーンが適用されます。ナイーブなプログラマーと混同して、Date にはタイムゾーンがあるように見えますが、ありません。

java.util.Datej.u.Calendar、およびjava.text.SimpleDateFormatJavaのクラスにバンドルさは悪名高い厄介です。それらを避けてください。代わりに、以下の有効な日時ライブラリのいずれかを使用してください。

java.time(Java 8)

Java 8は、古いjava.util.Date/Calendarクラスに取って代わる優れた新しいjava.time。*パッケージ提供します。

UTC / GMTで現在の時刻を取得することは簡単なワンライナーです…

Instant instant = Instant.now();

そのInstantクラスはjava.timeの基本的なビルディングブロックであり、ナノ秒の解像度でUTCのタイムライン上の瞬間を表します。

Java 8では、現在の瞬間が最大数ミリ秒の分解能でキャプチャされます。Java 9は、Clockホストコンピュータのクロックハードウェアの能力に応じて、このクラスのフルナノ秒の能力で現在の瞬間をキャプチャする新しい実装もたらします。

このtoStringメソッドは、1つの特定のISO 8601形式を使用して、その値の文字列表現を生成します。その形式は、の端数を表すために必要に応じて、0、3、6、または9桁の数字(ミリ秒マイクロ秒、またはナノ秒)を出力します。

より柔軟な書式設定またはその他の追加機能が必要な場合は、UTC自体(ZoneOffset.UTC定数)がを取得するように、ゼロからのオフセットからのオフセットを適用しますOffsetDateTime

OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );

コンソールにダンプ…

System.out.println( "now.toString(): " + now );

実行すると…

now.toString(): 2014-01-21T23:42:03.522Z

モダンとレガシーの両方のJavaの日時タイプの表。


java.timeについて

java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*

java.timeクラスはどこで入手できますか?

JavaまたはAndroidのどのバージョンで使用するjava.timeライブラリの表

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


ジョーダタイム

更新:現在メンテナンスモードになっているJoda -Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

使用ジョダタイムサードパーティのオープンソースのフリーのコストライブラリーは、コードのちょうど1行に現在の日付・時刻を取得することができます。

Joda-TimeはJava 8の新しいjava.time。*クラスに影響を与えましたが、アーキテクチャが異なります。古いバージョンのJavaではJoda-Timeを使用できます。Joda-Timeは引き続きJava 8で動作し、アクティブに維持され続けます(2014年現在)。ただし、Joda-Timeチームはjava.timeへの移行を推奨しています。

System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );

より詳細なサンプルコード(Joda-Time 2.3)…

org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );

コンソールにダンプ…

System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );

実行すると…

Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z

タイムゾーンの作業を行うコードの例について、同様の質問に対する私の回答を参照しください。

タイムゾーン

JVMの現在のデフォルトのタイムゾーン(いつでも変更される可能性があります)に暗黙的に依存するのではなく、常にタイムゾーンを指定することをお勧めします。このような依存は、日時の作業における混乱とバグの一般的な原因のようです。

呼び出しnow()時に、割り当てられる予定の/予想されるタイムゾーンを渡します。DateTimeZoneクラスを使用します。

DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );

そのクラスはUTCタイムゾーンの定数を保持します。

DateTime now = DateTime.now( DateTimeZone.UTC );

JVMの現在のデフォルトのタイムゾーンを本当に使用したい場合は、コードを自己文書化するように明示的に呼び出します。

DateTimeZone zoneDefault = DateTimeZone.getDefault();

ISO 8601

ISO 8601形式についてお読みください。java.timeとJoda-Timeはどちらも、文字列の解析と生成の両方のデフォルトとして、その標準の実用的な形式を使用しています。


実際には、java.util.Dateにタイムゾーンがあり、ソースコードのレイヤーの下に埋め込まれています。ほとんどの場合、そのタイムゾーンは無視されます。したがって、省略形として、java.util.Dateにはタイムゾーンがないと言います。さらに、その埋め込まれたタイムゾーンは、Dateの方法で使用されているものではありませんtoString。このメソッドは、JVMの現在のデフォルトのタイムゾーンを使用します。この紛らわしいクラスを避け、Joda-Timeとjava.timeを使い続ける理由はなおさらあります。


2
DateTime.now().toDateTime(DateTimeZone.UTC)私が探していたものでした!ありがとう!
Managarm 2015

1
あなたがにそれを短縮することができ@Managarm: DateTime nowUtc = DateTime.now ( DateTimeZone.UTC ) ;
バジルボーク

2014-01-21T15:34:29.933-08:00使用した例のPure Java 8 でこれを取得する方法new org.joda.time.DateTime()
GOXR3PLUS

1
@ GOXR3PLUS ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) ).truncatedTo( ChronoUnit.MILLIS ).toOffsetDateTime().toString() 指定されたタイムゾーンの現在の時刻を取得します。次に、すべてのマイクロ/ナノを落とします。次に、本格的なタイムゾーンではなく、単なるUTCからのオフセット(時間-分-秒の数)(過去、現在、および将来の履歴の変更で、特定の地域)。最後に、メソッドでOffsetDateTimeデフォルトで使用される標準ISO 8601形式に従って値を表すテキストを生成しますtoString
バジルブルク

この詳細な説明をありがとうございます。また、Androidサポートの+1 :) @BasilBourque
mochadwi

271
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));

//Local time zone   
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");

//Time in GMT
return dateFormatLocal.parse( dateFormatGmt.format(new Date()) );

11
dateFormatGmt形式を使用した後にdateFormatLocalで解析するのはなぜですか...読み取っても意味がありません。私はそれがうまくいくと確信していますが、ただ疑問に思いますか?
MindWire

2
setTimeZoneはそれを行いました(私はGMTと同じことをgetTimeZone( "UTC")を使用することもできると思いますか?)
rogerdpack

6
ただし、時間はデバイスの設定時間に依存します。ユーザーが自分のデバイスに間違った時間を設定した場合、UTCが間違って表示されます。間違っている場合は私を修正してください
Basavaraj Hampali

@BasavarajHampaliしかし、今日の世界ではほとんどのデバイスがインターネットに接続されているため、間違った時間を修正しています
Akshat Agarwal 2013

3
協定世界時(UTC)とグリニッジ標準時(GMT)の間に時差はありません
スロット

86

これは間違いなくUTC時間を返します:StringおよびDateオブジェクトとして!

static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

public static Date getUTCdatetimeAsDate() {
    // note: doesn't check for null
    return stringDateToDate(getUTCdatetimeAsString());
}

public static String getUTCdatetimeAsString() {
    final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    final String utcTime = sdf.format(new Date());

    return utcTime;
}

public static Date stringDateToDate(String StrDate) {
    Date dateToReturn = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);

    try {
        dateToReturn = (Date)dateFormat.parse(StrDate);
    }
    catch (ParseException e) {
        e.printStackTrace();
    }

    return dateToReturn;
}

私の回答では、DATEFORMATがどのように定義されているかを示すのを忘れていました: static final String DATEFORMAT = "yyyy-MM-dd HH:mm:ss";
Someone Somewhere

21
Javaではメソッド名を大文字で開始しないでください。メソッド名については、Javaコーディング規約を参照してください。
Florian Schrofner、2015年

2
この回答にリダイレクトされているnew Date()ように、デバイスの時間が間違っている場合、Calling は正しいUTC時間を返すことはありません。
サヌープ2017年

このメソッドは時間をデバイスのカレンダーに依存しますか?
アーノルドブラウン

注意すべきことの1つ。UTCで日付またはタイムスタンプを取得する必要があるすべてのソリューション。キーは、SimpleDateFormatを再利用せずに、UTCを文字列に取得してから、文字列をいずれかの日付に変換するときに別のUTCを作成することのようですまたはTimestamp Object。同じSimpleDateFormatを再利用しようとすると、結果の日付/タイムスタンプオブジェクトがUTCではなくローカルタイムゾーンに戻ることに気づきました。
ブライアン、

65
    Calendar c = Calendar.getInstance();
    System.out.println("current: "+c.getTime());

    TimeZone z = c.getTimeZone();
    int offset = z.getRawOffset();
    if(z.inDaylightTime(new Date())){
        offset = offset + z.getDSTSavings();
    }
    int offsetHrs = offset / 1000 / 60 / 60;
    int offsetMins = offset / 1000 / 60 % 60;

    System.out.println("offset: " + offsetHrs);
    System.out.println("offset: " + offsetMins);

    c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
    c.add(Calendar.MINUTE, (-offsetMins));

    System.out.println("GMT Time: "+c.getTime());

52

実際には時間ではありませんが、表現が変更される可能性があります。

SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(f.format(new Date()));

時間は地球のどの地点でも同じですが、場所によっては時間に対する認識が異なる場合があります。


うん、素敵でクリーンなソリューション。単にCalendarインスタンスを取得するのではなく、新しいDateオブジェクトを作成するのが効果的でない場合、それは私を心配しますか?
Beemo

これはJVMによって最適化され、HotSpotは可能な限り最も効果的なx86コードを実行します
Antonio

17

カレンダーaGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone( "GMT")); 次に、aGMTCalendarオブジェクトを使用して実行されるすべての操作はGMTタイムゾーンで行われ、夏時間や固定オフセットは適用されません。

違う!

Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
aGMTCalendar.getTime(); //or getTimeInMillis()

そして

Calendar aNotGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));aNotGMTCalendar.getTime();

同じ時間に戻ります。Idem for

new Date(); //it's not GMT.

17

このコードは、現在時刻UTCを出力します。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;


public class Test
{
    public static void main(final String[] args) throws ParseException
    {
        final SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
        f.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println(f.format(new Date()));
    }
}

結果

2013-10-26 14:37:48 UTC

14

これは、AndroidでUTCミリ秒を取得するために機能します。

Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);  
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;

7
オフセットを引く必要があるのはあなただけですか?
テブチ2013

c.add(Calendar.MILLISECOND, (-utcOffset))utcタイムゾーンでカレンダーを取得するには
Shanavas M

10

Jon Skeetの回答で間違っていると思われるものを次に示します。彼は言った:

java.util.Date常にUTCです。現地時間だと思うのはなぜですか?問題は、ローカルタイムゾーンを使用するCalendarのインスタンスを介して、またはおそらくDate.toString()ローカルタイムゾーンも使用するCalendarのインスタンスを介して表示していることだと思います 。

ただし、コード:

System.out.println(new java.util.Date().getHours() + " hours");

no Calendarおよびno SimpleDateFormatを使用して、GMT(UTC時間)ではなく現地時間を指定します。

だからこそ、何かがおかしいようです。

応答をまとめると、コード:

System.out.println(Calendar.getInstance(TimeZone.getTimeZone("GMT"))
                           .get(Calendar.HOUR_OF_DAY) + " Hours");

は現地時間の代わりにGMT時間を示します。これgetTime.getHours()Date()オブジェクトを作成するため欠落していることに注意してください。理論的にはGMTで日付を格納しますが、時間はローカルタイムゾーンで返します。


6
私はこれまでこの答えを見たことがありませんでしたが、非推奨のDate.getHours()メソッドのドキュメントを読むと、「戻り値は、を含むか、ローカルタイムゾーンで解釈される、このDateオブジェクトによって表される瞬間。」(Emphasis mine。)getHours()ローカルタイムゾーン内の値を解釈するメソッドDateです。オブジェクト自体の状態の一部ではありません。
ジョンスキート

2
Jon Skeetが正しく述べたように、java.util.Dateオブジェクトにはタイムゾーンがありません。しかし、紛らわしい、メソッドtoStringとは、getHoursその出力にデフォルトのタイムゾーンを適用します。つまり、Dateにはタイムゾーンがあるように見えますが、実際にはないので、ナイーブプログラマーは簡単に騙されます。
バジルブルク2014年

7

UTCに合わせてフィールドを調整したDateオブジェクトが必要な場合は、Joda Timeを使用して次のように行うことができます。

import org.joda.time.DateTimeZone;
import java.util.Date;

...

Date local = new Date();
System.out.println("Local: " + local);
DateTimeZone zone = DateTimeZone.getDefault();
long utc = zone.convertLocalToUTC(local.getTime(), false);
System.out.println("UTC: " + new Date(utc));

1
あなたは働きすぎです。Joda-Timeはこれを1行のコードで実行できます。この質問については、私自身の回答をご覧ください。.toDateTimeメソッドを呼び出し、UTCタイムゾーンの定数を渡します。
Basil Bourque 2013年

1
DateTime utcDate = new DateTime()。toDateTime(DateTimeZone.UTC)
Maciej Miklas 14年

6

以下を使用できます。

Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

次に、aGMTCalendarオブジェクトを使用して実行されるすべての操作はGMTタイムゾーンで行われ、夏時間や固定オフセットは適用されません。前の投稿者は正しいと思いますが、Date()オブジェクトは常にGMTを返しますが、ローカルタイムゾーンに変換される日付オブジェクトで何かを実行するまではそうではありません。


6
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(date));

回答に説明を追加してください。他の多くの回答とどう違うのですか?
akjoshi

このメソッドは時間をデバイスのカレンダーに依存しますか?
アーノルドブラウン

6

直接使用できます

SimpleDateFormat dateFormatGmt = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(new Date())+"");

5

と:

Calendar cal = Calendar.getInstance();

次にcal、現在の日付と時刻を取得します。
また、タイムゾーンの現在の日付と時刻を次のように取得できます。

Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));

cal.get(Calendar.DATE);他の詳細について、または他のカレンダー定数を尋ねることができます。
日付とタイムスタンプはJavaでは非推奨です。カレンダークラスではありません。


6
DateおよびTimestampの特定のメソッドおよびコンストラクターは非推奨ですが、クラス自体は非推奨です。
Powerlord 2008年

5

ここで、GMT Timestampオブジェクトを取得するための他の提案:

import java.sql.Timestamp;
import java.util.Calendar;

...

private static Timestamp getGMT() {
   Calendar cal = Calendar.getInstance();
   return new Timestamp(cal.getTimeInMillis()
                       -cal.get(Calendar.ZONE_OFFSET)
                       -cal.get(Calendar.DST_OFFSET));
}

5

これは、文字列形式でGMT時間を取得する別の方法です

String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss z" ;
final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
String dateTimeString =  sdf.format(new Date());

5

これが私のtoUTCの実装です:

    public static Date toUTC(Date date){
    long datems = date.getTime();
    long timezoneoffset = TimeZone.getDefault().getOffset(datems);
    datems -= timezoneoffset;
    return new Date(datems);
}

おそらくそれを改善する方法はいくつかありますが、私にとってはうまくいきます。


3

特定のタイムゾーンと特定の形式でシステム時間をレンダリングするサンプルコード。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class TimZoneTest {
    public static void main (String[] args){
        //<GMT><+/-><hour>:<minutes>
        // Any screw up in this format, timezone defaults to GMT QUIETLY. So test your format a few times.

        System.out.println(my_time_in("GMT-5:00", "MM/dd/yyyy HH:mm:ss") );
        System.out.println(my_time_in("GMT+5:30", "'at' HH:mm a z 'on' MM/dd/yyyy"));

        System.out.println("---------------------------------------------");
        // Alternate format 
        System.out.println(my_time_in("America/Los_Angeles", "'at' HH:mm a z 'on' MM/dd/yyyy") );
        System.out.println(my_time_in("America/Buenos_Aires", "'at' HH:mm a z 'on' MM/dd/yyyy") );


    }

    public static String my_time_in(String target_time_zone, String format){
        TimeZone tz = TimeZone.getTimeZone(target_time_zone);
        Date date = Calendar.getInstance().getTime();
        SimpleDateFormat date_format_gmt = new SimpleDateFormat(format);
        date_format_gmt.setTimeZone(tz);
        return date_format_gmt.format(date);
    }

}

出力

10/08/2011 21:07:21
at 07:37 AM GMT+05:30 on 10/09/2011
at 19:07 PM PDT on 10/08/2011
at 23:07 PM ART on 10/08/2011

3

これをより簡単にするために、を作成するにはDateUTC次を使用できますCalendar

Calendar.getInstance(TimeZone.getTimeZone("UTC"));

これはCalendar、「UTC」を使用するための新しいインスタンスを構築しますTimeZone

Dateそのカレンダーのオブジェクトが必要な場合は、を使用できますgetTime()


5
これに対してgetTime()を呼び出すと、タイムゾーン情報が失われ、現地時間が返されます。
RealCasually

3

現在の日時をUTCに変換する:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

DateTimeZone dateTimeZone = DateTimeZone.getDefault(); //Default Time Zone

DateTime currDateTime = new DateTime(); //Current DateTime

long utcTime = dateTimeZone.convertLocalToUTC(currDateTime .getMillis(), false);

String currTime = formatter.print(utcTime); //UTC time converted to string from long in format of formatter

currDateTime = formatter.parseDateTime(currTime); //Converted to DateTime in UTC

1
あなたはここで働きすぎです。(a)定義するフォーマッターパターンは、デフォルトで既にDateTimeに組み込まれています。toStringDateTimeを呼び出すだけで、ISO 8601文字列パターンを取得できます。(b)タイムゾーン間で変換するにはコードが多すぎる。「toDateTime」を呼び出して、タイムゾーンオブジェクトを渡すだけです。このように:myDateTime.toDateTime( DateTimeZone.UTC )。特定のタイムゾーンについては、適切な名前に基づいてタイムゾーンオブジェクトをインスタンス化して渡し、を呼び出しますmyDateTime.toDateTime( DateTimeZone.forID( "Asia/Tehran" ) )
バジルブルク2014年

2

これは私にとってはうまくいき、GMTでタイムスタンプを返します!

    Date currDate;
    SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
    dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
    SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");

    long currTime = 0;
    try {

        currDate = dateFormatLocal.parse( dateFormatGmt.format(new Date()) );
        currTime = currDate.getTime();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

2

このクラスを使用して、オンラインNTPサーバーから正しいUTC時間を取得します。

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


class NTP_UTC_Time
{
private static final String TAG = "SntpClient";

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;

private long mNtpTime;

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

        buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3);

        writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET);

        socket.send(request);

        // read the response
        DatagramPacket response = new DatagramPacket(buffer, buffer.length);
        socket.receive(response);          
        socket.close();

        mNtpTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET);            
    } catch (Exception e) {
      //  if (Config.LOGD) Log.d(TAG, "request time failed: " + e);
        return false;
    }

    return true;
}


public long getNtpTime() {
    return mNtpTime;
}


/**
 * Reads an unsigned 32 bit big endian number from the given offset in the buffer.
 */
private long read32(byte[] buffer, int offset) {
    byte b0 = buffer[offset];
    byte b1 = buffer[offset+1];
    byte b2 = buffer[offset+2];
    byte b3 = buffer[offset+3];

    // convert signed bytes to unsigned values
    int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0);
    int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1);
    int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2);
    int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3);

    return ((long)i0 << 24) + ((long)i1 << 16) + ((long)i2 << 8) + (long)i3;
}

/**
 * Reads the NTP time stamp at the given offset in the buffer and returns 
 * it as a system time (milliseconds since January 1, 1970).
 */    
private long readTimeStamp(byte[] buffer, int offset) {
    long seconds = read32(buffer, offset);
    long fraction = read32(buffer, offset + 4);
    return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L) / 0x100000000L);        
}

/**
 * Writes 0 as NTP starttime stamp in the buffer. --> Then NTP returns Time OFFSET since 1900
 */    
private void writeTimeStamp(byte[] buffer, int offset) {        
    int ofs =  offset++;

    for (int i=ofs;i<(ofs+8);i++)
      buffer[i] = (byte)(0);             
}

}

そしてそれを使って:

        long now = 0;

        NTP_UTC_Time client = new NTP_UTC_Time();

        if (client.requestTime("pool.ntp.org", 2000)) {              
          now = client.getNtpTime();
        }

DateTimeStringとして「今」UTC時間が必要な場合は、関数を使用します。

private String get_UTC_Datetime_from_timestamp(long timeStamp){

    try{

        Calendar cal = Calendar.getInstance();
        TimeZone tz = cal.getTimeZone();

        int tzt = tz.getOffset(System.currentTimeMillis());

        timeStamp -= tzt;

        // DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault());
        DateFormat sdf = new SimpleDateFormat();
        Date netDate = (new Date(timeStamp));
        return sdf.format(netDate);
    }
    catch(Exception ex){
        return "";
     }
    } 

と一緒に使用してください:

String UTC_DateTime = get_UTC_Datetime_from_timestamp(now);

1行で<br/> <pre> <code> Calendar utcTime = Calendar.getInstance()。add(Calendar.MILLISECOND、-time.getTimeZone()。getOffset(time.getTimeInMillis())); </ pre> < / code>
Harun

1
はい。ただし、これによりローカルのデバイス時間が呼び出され、手動でユーザーから偽のDateTimeに変更される可能性があります
Ingo


1

簡単に言えば。カレンダーオブジェクトはタイムゾーンに関する情報を格納しますが、cal.getTime()を実行すると、タイムゾーン情報が失われます。タイムゾーンの変換では、DateFormatクラスを使用することをお勧めします...


1

これは私の実装です:

public static String GetCurrentTimeStamp()
{
    Calendar cal=Calendar.getInstance();
    long offset = cal.getTimeZone().getOffset(System.currentTimeMillis());//if you want in UTC else remove it .
    return new java.sql.Timestamp(System.currentTimeMillis()+offset).toString();    
}

1

日付の解析を避け、GMTのタイムスタンプだけが必要な場合は、次のように使用できます。

final Date gmt = new Timestamp(System.currentTimeMillis()
            - Calendar.getInstance().getTimeZone()
                    .getOffset(System.currentTimeMillis()));

0

joda時間を使用していて、ローカルオフセットなしで現在の時間をミリ秒単位で知りたい場合は、次のように使用できます。

long instant = DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), System.currentTimeMillis());

0
public class CurrentUtcDate 
{
    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println("UTC Time is: " + dateFormat.format(date));
    }
}

出力:

UTC Time is: 22-01-2018 13:14:35

必要に応じて日付形式を変更できます。


1
若くして、古くて面倒なことで悪用されていることを教えないでくださいSimpleDateFormat。今日、私たちはjava.time最新のJavaの日付と時刻のAPIを大幅に改善しています。また、Dan、Antonioなどの回答に含まれていないものは何ですか。
Ole VV

2
(a)このAnswerは、何十もの既存のAnswerにどのように付加価値を与えますか?(b)ここで使用されている厄介なクラスは、数年前に現代のjava.timeクラスに取って代わられました。2018年にそれらを使用することを提案するのはよくないアドバイスです。
バジルブルク2018

0

java.timeパッケージを使用し、以下のコードを含めます-

ZonedDateTime now = ZonedDateTime.now( ZoneOffset.UTC );

または

LocalDateTime now2 = LocalDateTime.now( ZoneOffset.UTC );

アプリケーションのニーズに応じて。


(A)ZoneOffsetタイムゾーン(ZoneId)ではなくオフセット()を使用する場合は、OffsetDateTimeがより適切ですZonedDateTime。(B)LocalDateTimeタイムゾーンやUTCからのオフセットの概念がないため、現在の瞬間のキャプチャには使用しないでください。(C)他の既存の回答がこの資料をカバーし、より良い仕事をしました。この回答がどのように価値を追加するかはわかりません。
バジルブルク2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.