【问题标题】:What am I generating when I generate a java Calendar object?当我生成一个 java Calendar 对象时,我在生成什么?
【发布时间】:2020-12-04 17:25:21
【问题描述】:

我想知道我应该如何使用 java Calendar 对象才能正确使用它们(使用此类对于我的作业是强制性的,所以虽然我喜欢使用一些更好的选项 - 它们不是选项) .

我已阅读此处的文档:https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#:~:text=A%20Calendar%20object%20can%20produce,as%20well%20as%20their%20meaning

而且我还是不明白如何正确使用日历对象。

我需要代表几个火车站的到达和离开时间。我应该为每个到达时间和出发时间分别使用单独的日历对象吗?我可以将两者都包含在同一个对象中吗?

单个 Calendar 对象代表什么?它是单个时间点(即年、月、日、时、分)吗?现在我为每个车站的到达和离开时间使用单独的对象。这意味着我有大量的日历对象。我是否正确使用它们?

我的代码片段是:

    Calendar TimeArrival = Calendar.getInstance();
    Calendar TimeDeparture = Calendar.getInstance();
    TimeArrival.set  (2020,8,20,00,01);
    TimeDeparture.set(2020,8,20,20,30);

【问题讨论】:

  • 鉴于您只有 Calendar.getInstance(...) 的不同过载来创建新日历,并且它们都不允许您设置日期,我看不出还有什么可以做的问你。 --- 备注:在 Java 中,变量名应始终以小写字母开头。
  • 确保您正确设置月份 - 它是 zero-based,所以我们目前处于第 7 个月(如果“8”意味着当前月份)。
  • “它是一个单一的时间点”是的。它基本上是自纪元以来的毫秒数,以及时区,以便让您获取和设置与该区域相关的日期和时间部分。
  • 对不起,很遗憾,使用设计不佳且早已过时的Calendar 类是强制性的。有要求的老师应该被解雇。

标签: java datetime calendar java.util.calendar


【解决方案1】:

回答你的标题问题:你在生成什么?

计算机将时间表示为 long UTC 1970 年 1 月 1 日 00:00:00 后的毫秒数。您的日历还可能包含当地时区的副本。

最后,对 Calendar.getInstance 的调用很可能会返回一个 GregorianCalendar 对象。

【讨论】:

    【解决方案2】:

    我想知道我应该如何使用 java Calendar 对象

    不要使用 java.util 包中过时的容易出错的日期/时间 API。使用来自java.time 包的modern date/time API。通过 Trail: Date Time

    了解更多信息

    一个例子:

    import java.time.LocalDateTime;
    
    public class Main {
        public static void main(String[] args) {
            LocalDateTime dateTimeArrival = LocalDateTime.of(2020, 8, 20, 00, 01);
            LocalDateTime dateTimeDeparture = LocalDateTime.of(2020, 8, 20, 20, 30);
            System.out.println(dateTimeArrival);
            System.out.println(dateTimeDeparture);
        }
    }
    

    输出:

    2020-08-20T00:01
    2020-08-20T20:30
    

    如果要存储时区信息,请使用ZonedDateTimeOffsetDateTime。从下面给出的table 中根据您的要求选择课程:

    我需要代表几列火车的到达和出发时间 车站。我应该为每次到达使用单独的日历对象吗 时间和出发时间分开?我可以同时包含两者吗 对象?

    如果您只有几个日期时间信息实例,请使用上述不同的变量。如果您有多个实例要存储,您可以使用List(如果您事先知道实例的数量,则可以使用数组)例如

    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.temporal.TemporalAdjusters;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            List<LocalDateTime> dateTimes = new ArrayList<>();
            dateTimes.add(LocalDateTime.now());
            dateTimes.add(LocalDateTime.now().plusHours(2));
            dateTimes.add(LocalDateTime.now().with(TemporalAdjusters.lastDayOfMonth()));
            dateTimes.add(LocalDate.of(2020, 8, 10).atStartOfDay());
            // etc.
    
            System.out.println(dateTimes);
        }
    }
    

    输出:

    [2020-08-14T21:37:14.427085, 2020-08-14T23:37:14.429504, 2020-08-31T21:37:14.429518, 2020-08-10T00:00]
    

    【讨论】:

      【解决方案3】:

      我知道将您的日期和时间存储在现代 java.time 类的对象中不是一种选择;必须使用设计不佳且过时的Calendar 类。现代的ZonedDateTime 可能是最好的选择。

      …我应该为每个到达时间使用单独的日历对象吗? 发车时间分开?我可以将两者都包含在同一个对象中吗?

      是的,当您需要同时跟踪到达和离开时间时,您需要单独的对象。不,Calendar 对象只能保存一次,因此两者都不适合。

      作为补充,请允许我展示另外两种初始化 Calendar 对象的方法。

      现代:无论如何都要使用java.time

          ZoneId zone = ZoneId.of("Asia/Tokyo");
          ZonedDateTime arrivalZdt = ZonedDateTime.of(2020, 8, 20, 0, 1, 0, 0, zone);
          Calendar timeArrival = GregorianCalendar.from(arrivalZdt);
      

      有了这段代码,你就可以为你的老师意识到使用Calendar 是一个非常愚蠢的想法或者你换了另一位老师的那一天做好了准备。

      老式:使用 GregorianCalendar 构造函数

          Calendar timeArrival = new GregorianCalendar(2020, Calendar.AUGUST, 20, 0, 1);
      

      在任何情况下都不要在您的数字前面加上零。巧合的是0001 工作时间为0:01,但是当您使用0809 时,您的代码将不再编译。在 Java(和许多其他语言)中,以 0 开头的数字被视为八进制数。

      【讨论】:

      • With this code you are well prepared for the day when your teacher realizes that using Calendar was a very foolish idea, or you get another teacher. - 说得好!
      猜你喜欢
      • 2017-01-02
      • 1970-01-01
      • 2011-09-12
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多