我正在使用此代码
获取Android设备的timezone
TimeZone tz = TimeZone.getDefault();
String current_Time_Zone = (TimeZone.getTimeZone(tz.getID()).getDisplayName(
false, TimeZone.SHORT))
但它始终会返回timezone
之类的“IST
”,但我想在GMT
中获取时区GMT+7:00.
答案 0 :(得分:71)
这可能会让您了解如何根据自己的喜好实现它:
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”)
答案 1 :(得分:48)
此代码返回GMT偏移量。
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
Locale.getDefault());
Date currentLocalTime = calendar.getTime();
DateFormat date = new SimpleDateFormat("Z");
String localTime = date.format(currentLocalTime);
它返回时区偏移,如下所示: +0530
如果我们在下面使用SimpleDateFormat
DateFormat date = new SimpleDateFormat("z",Locale.getDefault());
String localTime = date.format(currentLocalTime);
它返回时区偏移,如下所示: GMT + 05:30
答案 2 :(得分:21)
以下是 GMT + 05:30 此格式获取时区偏移的解决方案
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;
}
答案 3 :(得分:15)
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:30
答案 4 :(得分:10)
一行解决方案是使用Z
符号,如:
new SimpleDateFormat(pattern, Locale.getDefault()).format(System.currentTimeMillis());
pattern
可以是:
这里有完整的参考:
http://developer.android.com/reference/java/text/SimpleDateFormat.html
答案 5 :(得分:7)
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;
}
答案 6 :(得分:5)
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;
答案 7 :(得分:5)
另一种获得时区偏移的解决方案:
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);
}
答案 8 :(得分:4)
TimeZone timeZone = TimeZone.getDefault();
String timeZoneInGMTFormat = timeZone.getDisplayName(false,TimeZone.SHORT);
输出:GMT + 5:30
答案 9 :(得分:4)
如果有人正在研究如何将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;
答案 10 :(得分:3)
你可以这样做:
TimeZone tz = TimeZone.getDefault();
int offset = tz.getRawOffset();
String timeZone = String.format("%s%02d%02d", offset >= 0 ? "+" : "-", offset / 3600000, (offset / 60000) % 60);
答案 11 :(得分:2)
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);
看看这是否有帮助:)
答案 12 :(得分:2)
这是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()
答案 13 :(得分:1)
我在使用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"
这个解决方案的优点在于它避免了大量的模数学,字符串生成和解析。
答案 14 :(得分:1)
我也一直在研究这个问题并试图找出如何应用时区和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;
}
这似乎有效,但有没有更好的方法让设备的实际时间代表一个对用户有意义和准确的时间?
答案 15 :(得分:1)
添加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;
答案 16 :(得分:0)
使用此代码(选项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
答案 17 :(得分:0)
要获取偏移时间为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
答案 18 :(得分:0)
您可以从此处通过此功能获取自定义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);
}
答案 19 :(得分:0)
通常,您无法从亚洲/加尔各答等时区转换为+05:30或+07:00等格林尼治标准时间偏移。顾名思义,时区是地球上的一个地方,包括该地方的人们使用的历史,当前和已知的未来UTC偏移量(目前,我们可以将GMT和UTC视为同义词,严格来说,它们不是同义词) 。例如,自1945年以来,亚洲/加尔各答的偏移量为+05:30。在1941年至1945年之间的时间段,偏移量为+06:30,而在此之前的偏移量为+05:53:20(是,精确到秒)。许多其他时区都有夏令时(夏令时,DST),并且每年更改两次偏移。
给定一个时间点,我们可以为该特定时间点进行翻译。我想提供一种现代化的方法。
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
(四个大写字母O)的格式化程序:
DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("OOOO");
System.out.println(offsetFormatter.format(offsetToday));
GMT + 05:30
我建议使用我的代码,我正在使用现代Java日期和时间API java.time。许多其他答案中使用的TimeZone
,Calendar
,Date
,SimpleDateFormat
和DateFormat
类的设计很差,现在已经过时了,所以我的建议是避免所有这些。
是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 20 :(得分:0)
我有一个正确的方法:
public static String getCurrentTimeZone() {
TimeZone timeZone = TimeZone.getDefault();
return createGmtOffsetString(true, true, timeZone.getRawOffset());
}
public static String createGmtOffsetString(boolean includeGmt,
boolean includeMinuteSeparator, int offsetMillis) {
int offsetMinutes = offsetMillis / 60000;
char sign = '+';
if (offsetMinutes < 0) {
sign = '-';
offsetMinutes = -offsetMinutes;
}
StringBuilder builder = new StringBuilder(9);
if (includeGmt) {
builder.append("GMT");
}
builder.append(sign);
appendNumber(builder, 2, offsetMinutes / 60);
if (includeMinuteSeparator) {
builder.append(':');
}
appendNumber(builder, 2, offsetMinutes % 60);
return builder.toString();
}
private static void appendNumber(StringBuilder builder, int count, int value) {
String string = Integer.toString(value);
for (int i = 0; i < count - string.length(); i++) {
builder.append('0');
}
builder.append(string);
}
答案 21 :(得分:-1)
我为自己找到的最佳解决方案
SimpleDateFormat("XXX", Locale.getDefault()).format(System.currentTimeMillis())
+03:00
您可以尝试更改模式(“ xxx”字符串)以获得所需的结果,例如:
SimpleDateFormat("XX", Locale.getDefault()).format(System.currentTimeMillis())
+0300
SimpleDateFormat("X", Locale.getDefault()).format(System.currentTimeMillis())
+03
模式也可以应用其他字母,结果将有所不同
SimpleDateFormat("Z", Locale.getDefault()).format(System.currentTimeMillis())
+0300
有关此内容的更多信息,您可以在这里找到:https://developer.android.com/reference/java/text/SimpleDateFormat.html
答案 22 :(得分:-2)
TimeZone timeZone = TimeZone.getTimeZone(“GMT + 7:00”);
明确宣布。