【问题标题】:get timezone in "+0100" (for example) format以“+0100”(例如)格式获取时区
【发布时间】:2012-05-24 06:55:14
【问题描述】:

我在文档和谷歌发现的众多与时间相关的问题之间迷失了。

我想要的很简单:一个代表运行时区的字符串 “[+/-] [数字] [数字] [数字] [数字]” 格式(例如“+0100”)。

我当前的代码是:

    Calendar cal = Calendar.getInstance();
    TimeZone tz = cal.getTimeZone();
    String gmt = "" + tz.getID();

在我的位置返回“GMT”,我假设它是时区的简短版本(3 个字母)。

【问题讨论】:

标签: java timezone datetime-format


【解决方案1】:

这是我最终使用的代码,希望对某人有所帮助。

Date today = Calendar.getInstance().getTime();
SimpleDateFormat sdf = new SimpleDateFormat("Z");
String gmt = sdf.format(today);

【讨论】:

    【解决方案2】:

    你应该试试下面的东西。

    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
    

    【讨论】:

    • 感谢您的快速答复。实际上我不需要日期(由用户在图形请求的上下文中定义),只需要 GMT 代码。 :) 不过,我有一个问题:如果时区是“负数”怎么办?
    • 那么就会以负数格式显示。您可以从offsetHrsoffsetMins 获取时区值。
    • 如果您愿意,请接受答案... :) :) :)
    • 所以 offsetHrs 将是负数,是这样吗?我必须考虑数字 os 数字,因为服务器需要一个信号 (+/-) 和 4 个数字。如果是这样,我会接受答案。 ;)
    【解决方案3】:

    您似乎想要 SimpleDateFormat 中的“Z”或“X”

    Z 时区 RFC 822 时区 -0800 X 时区 ISO 8601 时区 -08; -0800; -08:00

    【讨论】:

    • 我真的很喜欢你的方法,但如果你给我看一些替代代码就更好了。我将在答案中添加我当前的代码。
    【解决方案4】:

    java.time

    旧的日期时间 API(java.util 日期时间类型及其格式化 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern 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
    

    通过 Trail: Date Time 了解有关 modern date-time 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+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

    • 您可能希望使用小写的xx,这样您还可以得到+0000,而不是'Z'作为偏移量零。
    猜你喜欢
    • 2014-10-13
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2019-03-03
    • 2012-10-29
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多