【问题标题】:How to get time zone from date如何从日期获取时区
【发布时间】:2016-08-23 06:51:40
【问题描述】:

我正在尝试从现有日期获取时区,以将其用于其他日期转换。有人可以回复更新以下代码中的待办事项。感谢任何帮助。

或者只是为了简单起见,有一些 java api 我给 +0530 并返回 IST :)

这是我的代码:

import java.text.SimpleDateFormat
import java.util.*;
import java.text.DateFormat;

SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date date = isoFormat.parse("2016-04-21T00:00:00+0530");

//todo print time zone 
//todo here should print IST since date is having +0530

【问题讨论】:

  • 我认为您需要 4 个“Z”。 ("yyyy-MM-dd'T'HH:mm:ssZZZZ)
  • 不可能:多个时区在给定时刻可以有相同的时间偏移。
  • 您可以在这里找到答案:stackoverflow.com/questions/1305350/…
  • 为了简单起见,有一些 java api 我给 +0530 并返回 IST

标签: java datetime


【解决方案1】:

只是为了回答我自己,以便它可以帮助其他人:

我将日期作为字符串作为输入让我们说:

String startDate = "2016-04-21T00:00:00+0530"
//i can calculate the timezone offset using
String offSet = startDate.substring(startDate.length() - 5) //gives +0530

用于计算时区的方法。这里我们给出上面计算的偏移量,下面的方法返回 TimeZone 对象:

public static TimeZone fetchTimeZone(String offset) {
        if (offset.length() != 5) {
            return null
        }

        TimeZone tz

        Integer offsetHours = Integer.parseInt(offset.substring(0, 3))
        Integer offsetMinutes = Integer.parseInt(offset.substring(3))

        String[] ids = TimeZone.getAvailableIDs()

        for (int i = 0; i < ids.length; i++) {
            tz = TimeZone.getTimeZone(ids[i])

            long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset())
            long minutes = Math.abs(TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset()) % 60)

            if (hours != offsetHours || minutes != offsetMinutes) {
                tz = null
            } else {
                break
            }
        }
        return tz
    }

最后我使用上述方法中的时区将任何日期格式化为该时区:

SimpleDateFormat timeZonedFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
TimeZone timeZone = fetchTimeZone(offSet) //from above method and offset from first code
timeZonedFormatter.setTimeZone(timeZone);
//this timeZonedFormatter can be used to format any date into the respective timeZone

【讨论】:

    【解决方案2】:

    java.util.Date 没有时区。这是UTC的纯时间。解析器将字符串转换为内部值。

    java.time.ZonedDateTime (Java 8+) 确实有一个时区。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ");
    ZonedDateTime dt = ZonedDateTime.parse("2016-04-21T00:00:00+0530", formatter);
    ZoneId zone = dt.getZone();
    

    如果运行 Java 6 或 7,请使用 backport of the Java SE 8 date-time classes
    对于 Java 5+,请使用 Joda-Time library

    【讨论】:

    • 遗憾的是我的项目在 java 7 中。 java 7 是否给了一些我给 +0530 的 API,它返回 IST
    • 通常不能从时区偏移量中获取时区名称,因为有许多名称使用相同的偏移量。
    • @RahulBGangwar 时区是与 UTC 的偏移加上一组用于处理异常情况的规则,例如夏令时。 database of time zones 已经列出了共享相同偏移量 +05:30 的两个区域。明天可能还有更多。每个人可能有不同的规则。此外,停止使用 3-4 个字母代码,例如“IST”,因为它们既不标准化也不唯一(爱尔兰标准时间、印度……)。使用带有官方定义和历史的专有名称,Asia/ColomboAsia/KolkataEurope/Dublin
    【解决方案3】:

    这是不可能的。 Date 没有附加时区信息。它只是一个时间点,内部表示为自 1.1.1970 午夜 UTC 以来的毫秒数(不包括闰秒)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2016-10-21
      • 2013-03-15
      • 2014-12-21
      相关资源
      最近更新 更多