【问题标题】:How to add user timezone to utc date如何将用户时区添加到UTC日期
【发布时间】:2015-06-04 00:40:00
【问题描述】:

如何将用户时区添加到 UTC 我得到这样的UTC日期

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm:ss");
DateTime dateTime = formatter.withOffsetParsed().parseDateTime(getval[2]);
DateTime dateTimeUtc = dateTime.toDateTime(DateTimeZone.UTC);

现在我想获取用户时区并将其添加到 utc 以将其转换为本地时间

更新

我能够获取用户时区,但可以将其添加到 UTC

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm:ss");
DateTime dateTime = formatter.withOffsetParsed().parseDateTime(getval[2]);

java.util.Calendar now = java.util.Calendar.getInstance();
java.util.TimeZone timeZone = now.getTimeZone();

DateTimeZone dtZone = DateTimeZone.forID(timeZone.getID());
DateTime dateTimeUtc = dateTime.toDateTime(DateTimeZone.UTC);
ofm.setDate(dateTimeUtc.toDateTime(dtZone).toDate());

【问题讨论】:

标签: java jodatime


【解决方案1】:

以下代码可以帮助您获取用户的时区

//get Calendar instance
Calendar now = Calendar.getInstance();

//get current TimeZone using getTimeZone method of Calendar class
TimeZone timeZone = now.getTimeZone();

//display current TimeZone using getDisplayName() method of TimeZone class
System.out.println("Current TimeZone is : " + timeZone.getDisplayName());

以下链接还可以帮助您将用户的时区转换为 UTC

link

【讨论】:

【解决方案2】:

java.time

Joda-Time 项目由 JSR 310 中定义的 java.time 框架继承。这是使用 Java 8 及更高版本中的新类的现代解决方案.

您的输入格式几乎符合ISO 8601 标准。数据只是缺少日期部分和时间部分之间的T,并且在末尾缺少Z 以指示UTC。看看您是否可以让您的数据发布者了解这一重要标准。

String input = "2019-01-23T01:23:45.123456789Z" ;

java.time 类默认使用标准格式。所以不需要指定格式模式。

Instant instant = Instant.parse( input ) ;

instant.toString() = 2019-01-23T01:23:45.123456789Z

如果您可以更改输入格式,请定义要匹配的格式模式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-ddHH:mm:ss" ) ;

缺少任何时区或偏移量指示符,我们必须解析为LocalDateTime。请注意,这样的对象代表一个时刻,不是时间轴上的特定点。

String input = "2019-01-2301:23:45" ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString() = 2019-01-23T01:23:45

您声称确定此日期和时间旨在表示 UTC 中的某个时刻。因此我们可以使用常量ZoneOffset.UTC 应用偏移量来生成OffsetDateTime

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

odt.toString() = 2019-01-23T01:23:45Z

然后你说你想把它调整到一个特定的时区。同一时刻,时间轴上的同一点,但挂钟时间不同。

Continent/Region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 2-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

zdt.toString() = 2019-01-23T02:23:45+01:00[非洲/突尼斯]

如您所见,该日期的突尼斯比 UTC 时间早一个小时。因此,一天中的时间似乎是凌晨 2 点而不是凌晨 1 点。

【讨论】:

    【解决方案3】:

    这是一个从时区列表(以小时为单位)中获取差异的小示例:

        import java.util.Date;
        import java.util.TimeZone;
        public class StackOverflowTimeZone {
            public static void main(String[] a) {
                Date date = new Date();
                for(int index = 0; index < TimeZone.getAvailableIDs().length; index++) {
                    System.out.println(TimeZone.getAvailableIDs()[index] + " offset from UTC: " + TimeZone.getTimeZone(TimeZone.getAvailableIDs()[index]).getOffset(date.getTime()) / (60 * 60 * 1000) + " hours.");
                }
            }
        }
    

    抽象类 TimeZone 旨在获取指定时区与协调世界时 (UTC) 的偏移量。可以使用 TimeZone.getAvailableIDs() 方法找到一个时区列表。获得偏移量后,您需要进行一些小计算,以确定指定时区是在 UTC 之前还是之后。输出的符号 (+/-) 应与指定的时区早于或晚于 UTC 相关。

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 2014-03-14
      • 2019-09-15
      • 1970-01-01
      • 2021-03-26
      • 2016-02-17
      • 1970-01-01
      • 2018-08-21
      • 2021-07-03
      相关资源
      最近更新 更多