获取格林威治标准时间
Posted
技术标签:
【中文标题】获取格林威治标准时间【英文标题】:Get Greenwich Mean Time 【发布时间】:2013-03-10 14:24:11 【问题描述】:印度标准时间 (IST) 比格林威治标准时间早 5:30 小时(5 小时 30 分钟)。我们将其显示为 GMT+5.5。
有没有办法按时区找到这个值(在上述情况下,值 = 5.5)?
在我的 android 应用程序中,我可以获取设备时区。但是如何使用设备时区获取此值?
【问题讨论】:
提示:对时间跨度使用小数部分效果不佳。我建议您了解ZoneOffset
、ZoneId
用于偏移和时区工作,并了解Duration
和Period
类用于处理时间跨度。
【参考方案1】:
double timezoneval = 0.0;
Calendar cal = Calendar.getInstance();
cal.set(mn.Year(), mn.Month(), mn.Day(), mn.Hour(), mn.minute(),
(int) mn.second());
TimeZone tz = TimeZone.getDefault();
boolean t = tz.inDaylightTime(cal.getTime());
if (t)
timezoneval = ((TimeZone.getDefault().getRawOffset())
/ (60 * 60 * 1000D) + (TimeZone.getDefault()
.getDSTSavings() / (60 * 60 * 1000D)));
else
timezoneval = ((TimeZone.getDefault().getRawOffset()) / (60 * 60 * 1000D));
你可以试试这个代码。这将为您提供时区的值。如果你想要不同的时区值;只是改变
TimeZone tz = TimeZone.getDefault();
到
TimeZone tz = TimeZone.getTimeZone("Asia/Kolkata");
TimeZone.setDefault(tz);
它会为你工作。
【讨论】:
"Asia/Kolkata" 可以替换为不同的有效时区字符串。 我可以用tz.getRawOffset()
代替TimeZone.getDefault().getRawOffset()
吗?
您的代码中的mn
是什么? cal.set(mn.Year(), mn.Month(), mn.Day(), mn.Hour(), mn.minute(), (int) mn.second());
对不起...你可以设置日历; dats all....mn 是我自己实现的类的对象。那不是给你用的。抱歉没有提及。谢谢
如果您必须经常使用其他时区,使用 TimeZone.getDefault().getRawOffset() 会更安全。同时你必须设置 TimeZone tz = TimeZone.getTimeZone("Asia/Kolkata"); TimeZone.setDefault(tz); .否则你可以使用 tz.getRawOffset();【参考方案2】:
检查时区类。原始偏移量是您想要的,以毫秒为单位。您可以轻松地将其转换为以小时为单位的价值。
long rawOffset = TimeZone.getDefault().getRawOffset();
见http://developer.android.com/reference/java/util/TimeZone.html#getRawOffset()
【讨论】:
【参考方案3】:tl;博士
如何使用设备时区获取此值
ZonedDateTime.
now(
ZoneId.systemDefault() // Or: ZoneId.of("Asia/Kolkata")
)
.getOffset()
.toString()
看到这个code run live at IdeOne.com。
+05:30
java.time
使用现代 API java.time
的解决方案:
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main
public static void main(String[] args)
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
int seconds = zdt.getOffset().getTotalSeconds();
System.out.println(seconds);
// If required, convert it into hours
double hours = seconds / 3600.0;
System.out.println(hours);
输出:
19800
5.5
从Trail: Date Time了解更多关于java.time
,modern date-time API*。
* 出于任何原因,如果您必须坚持使用 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。
【讨论】:
【参考方案4】:试试:
TimeZone.getDefault();
getDefault() 返回当前设备的时区详细信息。然后,您可以致电getOffset() 以获取 UTC 与该时区之间的差异。
【讨论】:
【参考方案5】:试试这个代码
public class Sample
public static void main(String[] args)
// TODO Auto-generated method stub
try
String dateStr = "2010-06-14 02:21:49-0400";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
TimeZone tz = TimeZone.getDefault();
sdf.setTimeZone(tz);
Date date = sdf.parse(dateStr);
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
String newDateStr = sdf.format(date);
System.out.println(newDateStr);
catch (ParseException e)
// TODO Auto-generated catch block
e.printStackTrace();
输出应该是这样的
2010-06-14 上午 8:21:49
【讨论】:
【参考方案6】:这正是我需要的。
double rawOffset = TimeZone.getDefault().getRawOffset();
rawOffset = rawOffset / (60 * 60 * 1000);
System.out.println("rawOffset : " + rawOffset);
【讨论】:
以上是关于获取格林威治标准时间的主要内容,如果未能解决你的问题,请参考以下文章