美国股市的Java日历时区

3

我正在做与美国纽约证券交易所和纳斯达克股票市场相关的Android编程。目前我知道他们使用东部时间(ET)。 股票市场在ET上午9:30开盘,下午4点收盘。

为了检查股票市场当前是开放还是关闭,我想检查当前时间是否在上午9:30至下午4点之间。

以下代码正确吗?以获取用户在ET时区的时间?

Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("US/Eastern"));

据我所知,东部时间(ET)遵循夏令时规定。夏天使用 UTC-4 的 EDT,而冬天使用 UTC-5 的 EST。所以,纽约证券交易所和纳斯达克使用的是 ET 时区?

我想确保我的比较是使用与纽约证券交易所和纳斯达克股票市场相同的时区,即上午9:30至下午4点。

1个回答

4

根据由 IANA 维护的 tzdb,我会选择 "America/New_York" 代替过时的 id "US/Eastern"。

这个时区考虑了夏季的夏令时(但不包括冬季),因此可以应用于整个年份。

Wikipedia 表明纽约证券交易所和纳斯达克证券市场也使用这个时区。

顺便说一下,为了确保获得正确的日历(如果您在泰国),我会使用 new GregorianCalendar() 而不是 Calendar.getInstance()

评估开放条件可能会像这样(本地时间“9:30/16:00” 的半开区间):

    int hour = cal.get(Calendar.HOUR_OF_DAY);
    int minute = cal.get(Calendar.MINUTE);
    boolean open = (hour > 9 || (hour == 9 && minute >= 30)) && (hour < 16);

Meno Hochschild的回答非常好。对于建议,如果您正在处理时间,而不是使用new GregorianCalendar(),我建议考虑获取ThreeTenABP或Meno Hochschild(!)的Time4J。答案中的其他内容仍然适用。 - Ole V.V.
1
@OleV.V. 我认同你的观点,即旧的 Calendar API 不符合当前的编程实践(尽管人们在1995年有不同的看法),但我没有提及替代更现代的库,这些库具有更好的风格或更多的功能,因为我的指导方针是只有在旧设计无法令 OP 满意地解决具体问题时才建议使用它。我不知道 OP 想要投入多少复杂的日期/时间编程。关于我的库 Time4J,有一个姊妹项目 Time4A 适用于 Android 平台。 - Meno Hochschild
谢谢你的观点。我也不明白为什么GregorianCalendar不能在短视情况下正常工作,以确定当前时间是否在给定的营业时间内。只需再做一点点,就可能会发现它比使用更新的类更加繁琐或容易出错。我刚刚读到JSR-310似乎即将进入Android,所以我担心那些最终维护代码的人会因为使用陈旧的类而诅咒编码者。我承认,在这一点上,我可能已经变成了比你更多的传道者。 - Ole V.V.
1
@OleV.V. 确实,Android-O (level 25) 将包含 JSR-310,这使得 Threeten-ABP 不再必要(尽管 Time4A 仍然为那些需要更多功能的人提供更多功能)。然而,大多数人目前使用的手机仍将长时间使用旧版 Android 操作系统。我甚至有一种印象,谷歌并没有弃用旧的笨拙的 Calendar-API,而是越来越多地从 ICU4J 中加入了它(我也不喜欢它的 API 风格,它的风格类似于 java.util.Calendar),因此未来的 Android 将提供至少 3 种不同的日期时间 API。 - Meno Hochschild

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接