我在文档和谷歌发现的众多与时间相关的问题之间迷失了方向。
我想要的很简单:一个字符串,表示运行时区"[+/-] [数字] [数字] [数字] [数字] [数字]"格式(例如"+0100"(。
我当前的代码是:
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
String gmt = "" + tz.getID();
在我的位置返回"GMT",我假设这是时区的简短版本(3 个字母(。
这是我实际最终使用的代码,我希望它对某人有所帮助。
Date today = Calendar.getInstance().getTime();
SimpleDateFormat sdf = new SimpleDateFormat("Z");
String gmt = sdf.format(today);
你应该尝试以下事情。
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
似乎你想要 SimpleDateFormat 中的"Z"或"X"
Z 时区 RFC 822 时区 -0800X 时区 ISO 8601 时区 -08;-0800;-08:00
java.time
旧的日期时间 API(java.util
日期时间类型及其格式化 API,SimpleDateFormat
(已过时且容易出错。建议完全停止使用它并切换到现代日期时间 API java.time
*。
使用现代 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
要了解有关现代日期时间 API* 的更多信息,请参阅跟踪:日期时间。
<小时 />来自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+ API 和如何在 Android Project 中使用 ThreeTenABP。