534

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

4

32 に答える 32

437

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

正確には、a 内の値java.util.Dateは、1970 年 1 月 1 日の午前 0 時 (UTC) に発生した Unix エポックからのミリ秒数です。同じエポックは他のタイム ゾーンでも記述できますが、従来の記述は UTC に基づいています。これは固定エポックからのミリ秒数であるため、java.util.Dateローカル タイム ゾーンに関係なく、特定の時点での値は世界中で同じです。

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

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

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

于 2008-11-21T13:04:32.483 に答える
436
于 2013-10-28T10:14:46.423 に答える
279
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()) );
于 2010-03-27T07:08:23.167 に答える
91

これは間違いなく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;
}
于 2011-07-14T18:06:20.460 に答える
68
    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());
于 2010-03-16T11:14:00.263 に答える
56

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

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

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

于 2010-11-08T14:23:46.477 に答える
18

カレンダー 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();

同じ時間に戻ります。同上

new Date(); //it's not GMT.
于 2010-04-06T14:28:34.103 に答える
17

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

Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);  
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;
于 2013-05-16T19:35:11.493 に答える
10

JonSkeetの答えが間違っているように思われるものは次のとおりです。彼は言った:

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

ただし、コード:

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

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

そのため、何かが間違っているようです。

応答をまとめると、コードは次のようになります。

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

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

于 2012-05-22T18:01:10.167 に答える
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));
于 2012-05-04T10:51:55.123 に答える
6

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

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

おそらくいくつかの改善方法がありますが、私にはうまくいきます。

于 2016-08-31T15:10:16.523 に答える
6
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(date));
于 2010-12-21T11:36:14.037 に答える
6

以下を使用できます。

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

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

于 2010-01-26T16:32:00.830 に答える
6

これを直接使用できます

SimpleDateFormat dateFormatGmt = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(new Date())+"");
于 2012-04-17T06:39:27.163 に答える
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());
于 2012-10-01T03:48:52.807 に答える
4

と:

Calendar cal = Calendar.getInstance();

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

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

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

于 2008-11-21T13:10:06.107 に答える
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
于 2011-10-09T00:51:30.800 に答える
3

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

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

Calendar"UTC" を使用するための新しいインスタンスを構築しますTimeZone

Dateそのカレンダーのオブジェクトが必要な場合は、getTime().

于 2012-05-17T13:04:37.097 に答える
2
public static void main(String args[]){
    LocalDate date=LocalDate.now();  
    System.out.println("Current date = "+date);
}
于 2016-10-19T10:31:42.390 に答える
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();
    }
于 2013-03-25T12:46:16.860 に答える
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();    
}
于 2014-05-27T05:52:42.537 に答える
1

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

于 2012-12-05T08:21:38.047 に答える
0

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

long instant = DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), System.currentTimeMillis());
于 2015-07-08T10:18:30.217 に答える