如何从日期获取时区

时间:2016-04-28 13:15:17

标签: java datetime

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

或者只是为了简单,有一些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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

我的日期是字符串,因为输入可以说:

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