新しいDate
オブジェクトを作成すると、現在の時刻に初期化されますが、ローカル タイムゾーンになります。GMT で現在の日付と時刻を取得するにはどうすればよいですか?
32 に答える
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を使用することをお勧めします。
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()) );
これは間違いなく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;
}
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());
実際には時間ではありませんが、その表現は変更される可能性があります。
SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(f.format(new Date()));
時間は地球上のどの地点でも同じですが、時間の認識は場所によって異なる場合があります。
カレンダー 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.
これは、Android で UTC ミリ秒を取得するために機能します。
Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;
JonSkeetの答えが間違っているように思われるものは次のとおりです。彼は言った:
java.util.Date
常にUTCです。現地時間だと思う理由は何ですか?問題は、ローカルタイムゾーンを使用するCalendarのインスタンスを介して、またはローカルタイムゾーンも使用するCalendarを使用して表示していることであると思われますDate.toString()
。
ただし、コード:
System.out.println(new java.util.Date().getHours() + " hours");
Calendar
noおよびnoを使用して、GMT(UTC時間)ではなく現地時間を示しSimpleDateFormat
ます。
そのため、何かが間違っているようです。
応答をまとめると、コードは次のようになります。
System.out.println(Calendar.getInstance(TimeZone.getTimeZone("GMT"))
.get(Calendar.HOUR_OF_DAY) + " Hours");
は、現地時間の代わりにGMT時間を示しています。これは、理論的にはGMTで日付を格納getTime.getHours()
するオブジェクトを作成するため、欠落していることに注意してください。ただしDate()
、現地のタイムゾーンで時間を返します。
フィールドが 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));
これがtoUTCの私の実装です:
public static Date toUTC(Date date){
long datems = date.getTime();
long timezoneoffset = TimeZone.getDefault().getOffset(datems);
datems -= timezoneoffset;
return new Date(datems);
}
おそらくいくつかの改善方法がありますが、私にはうまくいきます。
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(date));
以下を使用できます。
Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
次に、aGMTCalendar オブジェクトを使用して実行されるすべての操作は GMT タイム ゾーンで実行され、夏時間や固定オフセットは適用されません。Date() オブジェクトは常に GMT を返すという前のポスターは正しいと思います。それは、ローカル タイム ゾーンに変換される日付オブジェクトで何かを行うまではありません。
これを直接使用できます
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(new Date())+"");
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());
と:
Calendar cal = Calendar.getInstance();
次にcal
、現在の日付と時刻を取得します。
次のようにして、タイムゾーンの現在の日付と時刻を取得することもできます。
Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));
cal.get(Calendar.DATE);
他の詳細については、または他のカレンダーの定数を尋ねることができます。
Date と Timestamp は、Java では推奨されていません。Calendar クラスではありません。
特定のタイムゾーンと特定の形式でシステム時刻をレンダリングするためのサンプルコード。
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
これを簡単にするために、 を作成するDate
には、UTC
次を使用できますCalendar
。
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Calendar
"UTC" を使用するための新しいインスタンスを構築しますTimeZone
。
Date
そのカレンダーのオブジェクトが必要な場合は、getTime()
.
public static void main(String args[]){
LocalDate date=LocalDate.now();
System.out.println("Current date = "+date);
}
これは私にとってはうまくいきました.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();
}
これは私の実装です:
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();
}
簡単に言えば。カレンダー オブジェクトはタイム ゾーンに関する情報を格納しますが、cal.getTime() を実行するとタイム ゾーン情報が失われます。したがって、タイムゾーンの変換については、DateFormat クラスを使用することをお勧めします...
joda 時間を使用していて、現在の時刻をミリ秒単位でローカル オフセットなしで取得したい場合は、次のように使用できます。
long instant = DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), System.currentTimeMillis());