我正在尝试从现有日期获取时区,以将其用于其他日期转换。有人可以回复更新以下代码中的待办事项。感谢任何帮助。
或者只是为了简单,有一些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
答案 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