我在文档和谷歌发现的许多与时间相关的问题之间迷失了方法。
我想要的非常简单:一个表示运行时区的字符串 “[+/-] [数字] [数字] [数字] [数字]” 格式(例如“+0100”)。
我目前的代码是:
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
String gmt = "" + tz.getID();
在我的位置返回“GMT”,我假设它是时区的短版本(3个字母)。
答案 0 :(得分:7)
以下是我最终使用的代码,我希望它可以帮助某人。
Date today = Calendar.getInstance().getTime();
SimpleDateFormat sdf = new SimpleDateFormat("Z");
String gmt = sdf.format(today);
答案 1 :(得分:3)
你应该尝试一下。
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));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("GMT Time: " + sdf.format(c.getTime()) + " +"
+ offsetHrs + ":" + offsetMins);
<强>输出强>
current: Wed May 16 22:32:14 IST 2012
offset: 5
offset: 30
GMT Time: 2012-05-16 17:02:14 +5:30
答案 2 :(得分:1)
您似乎想在SimpleDateFormat中使用“Z”或“X”
Z Time zone RFC 822 time zone -0800 X Time zone ISO 8601 time zone -08; -0800; -08:00
答案 3 :(得分:1)
旧的日期时间 API(java.util
日期时间类型及其格式 API,SimpleDateFormat
)已经过时且容易出错。建议完全停止使用,改用java.time
,modern date-time API*。
使用现代 API 的解决方案:
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Replace ZoneId as applicable e.g. ZoneId.of("America/New_York")
ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("XX", Locale.ENGLISH);
String offset = dtf.format(now);
System.out.println(offset);
}
}
输出:
+0100
从 modern date-time API 中了解有关 Trail: Date Time* 的更多信息。
来自 Ole V.V. 的反馈:
<块引用>您可能希望使用小写的 xx
,这样您也会得到 +0000
而不是
Z
表示偏移为零。
谢谢,Ole V.V.对于那些寻找 +0000
而不是 Z
的零时区偏移的人来说,增值是有益的。我建议严格根据具体要求使用它。 ISO 8601 建议使用 Z
作为零时区偏移的时区指示符。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。