我有timezone = "[PST -08:00] America/Los Angeles (Pacific Standard Time)"
格式。我有time["03:00 pm"]
和date[2018/4/22]
。我需要检查当前当地时间是否少于12小时。
joda DateTimeZone不接受此ID [DateTimeZone.forID("[PST -08:00] America/Los Angeles (Pacific Standard Time)"]
。
任何选项?
这里我只关注时区选项。如何将时区字符串干净地转换为时区?
答案 0 :(得分:1)
您应该只使用Continent/Region
,格式为DateTimeZone.forID("America/Los_Angeles");
。在这种情况下,您应该使用:
_
请注意,该名称为" Los _ Angeles",而不是"洛杉矶" (那里有DateTimeZone.getAvailableIDs()
而不是 Los 和 Angeles 之间的空格。
您可以通过循环for (String zoneName : DateTimeZone.getAvailableIDs()) {
System.out.println(zoneName);
}
返回的集合来检查所有可用的名称:
Map<String, String> names = new HashMap<String, String>();
names.put("[PST -08:00] America/Los Angeles (Pacific Standard Time)", "America/Los_Angeles");
在您的具体情况下,您应该解析字符串(正如Georg的答案解释)或将其映射到有效的IANA名称:
if (timezoneName.contains("Los Angeles")) {
// use America/Los_Angeles
}
或使用其他一些逻辑,例如:
{{1}}
答案 1 :(得分:0)
您必须决定是否要解释长或短偏移。我去了长偏移,因为你可以用长名“America / Los_Angeles”创建一个ZoneId。然后,ZoneId查询IANA时区数据库 - 请参阅spec。此测试用例从给定的模式中提取名称。
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
public class Zone {
@Test
public void zoneId() throws ParseException {
String zoneName = "[PST -08:00] America/Los Angeles (Pacific Standard Time)";
String time = "03:00 pm";
String dateString = "2018/4/22";
String americaLosAngelesPST = zoneName.substring(zoneName.indexOf("]") + 2, zoneName.length());
String americaLosAngeles = americaLosAngelesPST.substring(0, americaLosAngelesPST.indexOf("(") - 1).replace(" ", "_");
ZoneId zone = ZoneId.of(americaLosAngeles);
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy/MM/dd KK:mm a");
Date parsedDateTime = inputFormat.parse(dateString + " " + time);
ZonedDateTime inputZonedDateTime = parsedDateTime.toInstant().atZone(zone);
// compare with ZonedDateTime.now()
}
}
答案 2 :(得分:0)
还有一个java.time
答案。我去找-08:00
:
String offsetString = timezone.replaceFirst("\\[[^ ]+ ([+-]\\d{2}:\\d{2})\\].*", "$1");
ZoneOffset offset = ZoneOffset.of(offsetString);
这给出了-08:00
的偏移量。如果你确实需要一个时区,我喜欢别人去美国/洛杉矶,这是明确的,而三和四个字母的缩写不是标准化的,通常是模糊的,往往不是真正的时区。例如,PST可能意味着太平洋标准时间,菲律宾标准时间或皮特凯恩标准时间。但是,要确定时间是否在当地时间中午12点之前,偏移量就足够了,并且解析和使用都更简单。
有趣的是,您的整个时区字符串可以由DateTimeFormatter.ofPattern("'['zzz xxx']' VV (zzzz)", Locale.US)
解析(如果不是),因为时区以America/Los Angeles
给出,城市名称中有空格。 IANA时区ID在那里有一个下划线。只是因为这个我需要在解析之前对字符串进行一些操作。然后我走了一路,取出了所需的偏移量。
Joda-Time处于维护模式,没有预见到重大改进,他们的开发团队建议迁移到java.time
。我不知道Joda-Time,如果你愿意,我想你可以将我的答案翻译成Joda-Time。