このコードを使用してAndroidデバイスのtimezone
を取得しています
TimeZone tz = TimeZone.getDefault();
String current_Time_Zone = (TimeZone.getTimeZone(tz.getID()).getDisplayName(
false, TimeZone.SHORT))
しかし、それは常に「timezone
」のようなIST
を返しますが、GMT
のタイムゾーンを取得したいGMT+7:00.
このコードは、GMTオフセットを返します。
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
Locale.getDefault());
Date currentLocalTime = calendar.getTime();
DateFormat date = new SimpleDateFormat("Z");
String localTime = date.format(currentLocalTime);
次のようなタイムゾーンオフセットを返します。+ 05
以下のSimpleDateFormatを使用する場合
DateFormat date = new SimpleDateFormat("z",Locale.getDefault());
String localTime = date.format(currentLocalTime);
次のようなタイムゾーンオフセットを返します。GMT + 05:
これはあなたの好みにそれを実装する方法についてのアイデアを与えるかもしれません:
Calendar mCalendar = new GregorianCalendar();
TimeZone mTimeZone = mCalendar.getTimeZone();
int mGMTOffset = mTimeZone.getRawOffset();
System.out.printf("GMT offset is %s hours", TimeUnit.HOURS.convert(mGMTOffset, TimeUnit.MILLISECONDS));
(TimeUnitは「Java.util.concurrent.TimeUnit」です)
GMT + 05:この形式でタイムゾーンオフセットを取得するソリューションを次に示します。
public String getCurrentTimezoneOffset() {
TimeZone tz = TimeZone.getDefault();
Calendar cal = GregorianCalendar.getInstance(tz);
int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = "GMT"+(offsetInMillis >= 0 ? "+" : "-") + offset;
return offset;
}
public static String timeZone()
{
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.getDefault());
String timeZone = new SimpleDateFormat("Z").format(calendar.getTime());
return timeZone.substring(0, 3) + ":"+ timeZone.substring(3, 5);
}
+ 03:のような結果を返します
1行の解決策は、次のようにZ
シンボルを使用することです。
new SimpleDateFormat(pattern, Locale.getDefault()).format(System.currentTimeMillis());
pattern
は次のとおりです。
完全なリファレンスはこちら:
http://developer.Android.com/reference/Java/text/SimpleDateFormat.html
public static String getCurrentTimezoneOffset() {
TimeZone tz = TimeZone.getDefault();
Calendar cal = GregorianCalendar.getInstance(tz);
int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
return offset;
}
TimeZone tz = TimeZone.getDefault();
Calendar cal = GregorianCalendar.getInstance(tz);
int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
タイムゾーンオフセットを取得するさらに別のソリューション:
TimeZone tz = TimeZone.getDefault();
String current_Time_Zone = getGmtOffsetString(tz.getRawOffset());
public static String getGmtOffsetString(int offsetMillis) {
int offsetMinutes = offsetMillis / 60000;
char sign = '+';
if (offsetMinutes < 0) {
sign = '-';
offsetMinutes = -offsetMinutes;
}
return String.format("GMT%c%02d:%02d", sign, offsetMinutes/60, offsetMinutes % 60);
}
TimeZone timeZone = TimeZone.getDefault();
String timeZoneInGMTFormat = timeZone.getDisplayName(false,TimeZone.SHORT);
出力:GMT + 5:30
GMTを時間オフセットを表す浮動小数点数として表す方法を探している場合
(たとえば、「GMT-0530」から-5.5)、これを使用できます:
Calendar calendar = new GregorianCalendar();
TimeZone timeZone = calendar.getTimeZone();
int offset = timeZone.getRawOffset();
long hours = TimeUnit.MILLISECONDS.toHours(offset);
float minutes = (float)TimeUnit.MILLISECONDS.toMinutes(offset - TimeUnit.HOURS.toMillis(hours)) / MINUTES_IN_HOUR;
float gmt = hours + minutes;
このようにすることができます:
TimeZone tz = TimeZone.getDefault();
int offset = tz.getRawOffset();
String timeZone = String.format("%s%02d%02d", offset >= 0 ? "+" : "-", offset / 3600000, (offset / 60000) % 60);
これは、GoogleがTimezoneOffsetを取得することを推奨する方法です。
Calendar calendar = Calendar.getInstance(Locale.getDefault());
int offset = -(calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / (60 * 1000)
https://developer.Android.com/reference/Java/util/Date#getTimezoneOffset()
TimeZone tz = TimeZone.getDefault();
String gmt1=TimeZone.getTimeZone(tz.getID())
.getDisplayName(false,TimeZone.SHORT);
String gmt2=TimeZone.getTimeZone(tz.getID())
.getDisplayName(false,TimeZone.LONG); Log.d("Tag","TimeZone : "+gmt1+"\t"+gmt2);
これが役立つかどうかを確認してください:)
ZoneDateTime
クラスを使用して、Java8(Android以外)でこのための簡単なソリューションを見つけました。動作するTemporalAccessor
インターフェースを実装する他のクラスがあるかもしれませんが、私はそれらを見つけていません。これは、私の知る限り、標準のDate
、DateTime
、LocalDateTime
、およびCalender
クラスでは機能しません。
ZoneOffset myOffset = ZonedDateTime.now().getOffset();
ZoneOffset myOffset2 = ZoneOffset.from(ZonedDateTime.now());
log.info("ZoneOffset is " + myOffset.getId()); // should print "+HH:MM"
log.info("ZoneOffset2 is " + myOffset2.getId()); // should print "+HH:MM"
このソリューションの素晴らしい点は、多くのモジュロ演算、文字列生成、解析を回避できることです。
通常、Asia/Kolkataなどのタイムゾーンから+05:30や+07:00などのGMTオフセットに変換することはできません。タイムゾーンは、名前が示すように、地球上の場所であり、その場所の人々が使用する歴史的、現在、および既知の将来のUTCオフセットで構成されます(今のところ、GMTとUTCは同義語と見なすことができますが、厳密にはそうではありません) 。たとえば、アジア/コルカタは1945年からオフセット+05:30にあります。1941年から1945年までの期間は+06:30で、その前は+05:53:20(はい、秒単位の精度)です。他の多くのタイムゾーンには夏時間(夏時間、DST)があり、年に2回オフセットを変更します。
ただし、特定の時点を指定すると、その特定の時点の翻訳を作成できます。そのための最新の方法を提供したいと思います。
ZoneId zone = ZoneId.of("Asia/Kolkata");
ZoneOffset offsetIn1944 = LocalDateTime.of(1944, Month.JANUARY, 1, 0, 0)
.atZone(zone)
.getOffset();
System.out.println("Offset in 1944: " + offsetIn1944);
ZoneOffset offsetToday = OffsetDateTime.now(zone)
.getOffset();
System.out.println("Offset now: " + offsetToday);
今実行したときの出力は次のとおりです。
Offset in 1944: +06:30 Offset now: +05:30
デフォルトのタイムゾーンでは、zone
をZoneId.systemDefault()
に設定します。
テキストGMT
でオフセットをフォーマットするには、パターンでOOOO
(4つの大文字O)を使用してフォーマッターを使用します。
DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("OOOO");
System.out.println(offsetFormatter.format(offsetToday));
GMT + 05:30
私はコードで、Java.timeを使用しています。最新のJava日時API。TimeZone
、Calendar
、Date
、他の回答の多くで使用されているSimpleDateFormat
およびDateFormat
クラスは設計が不十分で、現在では古くなっているため、すべてのクラスを避けることをお勧めします。
はい、Java.timeは古いものと新しいものでうまく動作しますAndroidデバイス。少なくともJava 6が必要です。
org.threeten.bp
から日時クラスをインポートしてください。Java.time
が最初に記述されました。Java.time
のバックポートJava 6および7(JSR-310用のThreeTen))。私もこれを見て、タイムゾーンとDSTを適用する方法を考えています。これが私のコードです。
public long applyGMTOffsetDST(long time) {
// Works out adjustments for timezone and daylight saving time
Calendar mCalendar = new GregorianCalendar();
TimeZone mTimeZone = mCalendar.getTimeZone();
boolean dstBool = mTimeZone.getDefault().inDaylightTime( new Date() );
// add an hour if DST active
if (dstBool == true) {
time = time + secondsPerHour;
}
// add offest hours
int mGMTOffset = mTimeZone.getRawOffset();
if (mGMTOffset > 0) {
long offsetSeconds = secondsPerHour * mGMTOffset;
time = time + offsetSeconds;
}
return time;
}
これはうまくいくようですが、ユーザーにとって意味のある正確な時間を表す実際の時間をデバイスから取得するより良い方法はありますか?
Dstオフセットを追加すると、これが解決されます。
int offsetInMillis = TimeZone.getDefault().getRawOffset()+TimeZone.getDefault().getDSTSavings();
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
return offset;
2019-07-22T13:39:27.397+05:00
のようなオフセットで日付時刻を取得するには、次のKotlinコードを試してください。
fun getDateTimeForApiAsString() : String{
val date = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX",
Locale.getDefault())
return date.format(Date())
}
出力フォーマット:
2019-07-22T13:39:27.397+05:00 //for Pakistan
他の同様の形式が必要な場合は、以下のようにSimpleDateFormat
のパターンを置き換えます。
"yyyy.MM.dd G 'at' HH:mm:ss z" //Output Format: 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" //Output Format: Wed, Jul 4, '01
"h:mm a" //Output Format: 12:08 PM
"hh 'o''clock' a, zzzz" //Output Format: 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" //Output Format: 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" //Output Format: 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" //Output Format: Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" //Output Format: 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" //Output Format: 2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" //Output Format: 2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u" //Output Format: 2001-W27-3
次のコードを使用します(Opt 1):
//Opt 1
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
Locale.getDefault());
Date currentLocalTime = calendar.getTime();
DateFormat date = new SimpleDateFormat("Z", Locale.getDefault());
String localTime = date.format(currentLocalTime);
String finalTimezone = String.format("GMT%s:%s", localTime.substring(0, 3), localTime.substring(3));
Log.d(TAG, "timezone 1: " + finalTimezone);
//Opt 2
date = new SimpleDateFormat("z",Locale.getDefault());
localTime = date.format(currentLocalTime);
Log.d(TAG, "timezone 2: "+localTime);
//Opt 3
TimeZone tz = TimeZone.getDefault();
Log.d(TAG, "timezone 3: "+tz.getDisplayName(true, TimeZone.SHORT));
//
ロサンゼルスにいる場合(GTM-07:00太平洋標準時)、出力は次のとおりです。
timezone 1: GMT-07:00
timezone 2: PDT
timezone 3: PDT
ここからこの関数からカスタムGMT時間を取得できます
public static String getCurrentDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd hh:mm a zzz");
Date date = new Date();
sdf.setTimeZone(TimeZone.getTimeZone("GMT+6:00"));
return sdf.format(date);
}