【问题标题】:Java Calendar TimeZone for US Stock Market美国股市的 Java 日历时区
【发布时间】:2017-11-09 13:27:45
【问题描述】:

我正在做与US NYSE & NASDAQ stock market 相关的Android 编程。到目前为止,我知道他们使用的是东部时间 (ET)。股市于美国东部时间上午 9.30 开市,下午 4 点收市。

为了查看当前股市开盘/收盘,我想查看当前时间是否在上午 9.30 - 下午 4 点之间。

以下代码是否正确,以获取 ET 时区的用户时间?

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

当我阅读时,东部时间 (ET) 遵守夏令时。夏季使用 EDT,即 UTC-4,而冬季使用 EST,即 UTC-5。那么 NYSE 和 NASDAQ 使用的是 ET 时区吗?

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

【问题讨论】:

    标签: java android timezone stocks java.util.calendar


    【解决方案1】:

    根据 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。答案中的其他所有内容仍然适用。
    • @OleV.V.我同意你的观点,即旧的Calendar-API 根据当前的编程实践设计得不好(人们在 1995 年有不同的判断),但我没有提到具有更好风格或更多功能的替代更现代的库,因为我的指南在这里仅在旧设计无法以令人满意的方式解决OP的具体问题时才提出建议。我不知道 OP 想在复杂的日期/时间编程上投入多少。关于我的lib Time4J,有一个姐妹项目Time4A为Android平台
    • 感谢您的意见。我也不明白为什么GregorianCalendar 在短期内无法确定当前时间是否在给定的开放时间内。多做一点,可能会发现它比新类更麻烦或更容易出错。我刚刚读到 JSR-310 似乎要进入 Android,所以我担心那些最终维护代码的人会诅咒编码器使用了破旧的类。我承认,在这一点上,我可能比你更像一个传道者。
    • @OleV.V.事实上,Android-O(25 级)将包含 JSR-310,这使得 Threeten-ABP 变得不必要(而 Time4A 仍会为需要它的人提供更多功能)。但是,目前人们使用的大部分手机,在很长一段时间内仍然会使用旧的 Android OS 版本。而且我什至有这样的印象,谷歌并没有弃用旧的笨拙的 Calendar-API,而是越来越多地从 ICU4J 中加入(我也不喜欢它的 API 风格,它类似于 java.util.Calendar 的风格),所以未来的 Android 将提供至少 3 种不同的日期时间 API。
    猜你喜欢
    • 2022-09-29
    • 2022-10-23
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多