获取格林威治标准时间

Posted

技术标签:

【中文标题】获取格林威治标准时间【英文标题】:Get Greenwich Mean Time 【发布时间】:2013-03-10 14:24:11 【问题描述】:

印度标准时间 (IST) 比格林威治标准时间早 5:30 小时(5 小时 30 分钟)。我们将其显示为 GMT+5.5。

有没有办法按时区找到这个值(在上述情况下,值 = 5.5)?

在我的 android 应用程序中,我可以获取设备时区。但是如何使用设备时区获取此值?

【问题讨论】:

提示:对时间跨度使用小数部分效果不佳。我建议您了解ZoneOffsetZoneId 用于偏移和时区工作,并了解DurationPeriod 类用于处理时间跨度。 【参考方案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);

【讨论】:

以上是关于获取格林威治标准时间的主要内容,如果未能解决你的问题,请参考以下文章

格林尼治标准时间对照表(格林尼治标准时间)

格林威治时间

如何在 Oracle 中获取当前的 GMT

iPhone:将格林威治标准时间转换为当地时间

PHP 时区问题 |英国夏令时和格林威治标准时间

格林威治标准时间的奇怪 strtotime 一直有效到 3 月 31 日