【问题标题】:Convert month and day number to day of year using CALENDAR使用 CALENDAR 将月份和日期数字转换为一年中的日期
【发布时间】:2019-01-23 14:46:09
【问题描述】:

我有两个号码。 首先是月份数。 其次是天数。

我也知道年份。

如何将这两个数字、月份和日期变成一个数字 DAY_OF_YEAR?

我正在使用 Java 1.7 和日历功能。

【问题讨论】:

标签: java date calendar


【解决方案1】:

java.time 到 ThreeTen Backport

    int year = 2019;
    int monthNumber = 9;
    int dayNumber = 28;

    LocalDate date = LocalDate.of(year, monthNumber, dayNumber);
    int dayOfYear = date.getDayOfYear();

    System.out.println("Day of year is " + dayOfYear);

这个 sn-p 的输出是:

一年中的第 271 天

使用 ThreeTen Backport 1.3.6 在 Java 1.7.0_79 上测试并导入 org.threeten.bp.LocalDate

考虑避免 Calendar 类

创建和设置Calendar 对象的当前接受答案的四行在此处仅被一行替换。使用Calendar 的代码通常会如此冗长,这是我们不应该想要的。此外,尽管Calendar 对象的名称不仅仅是一个日历日期,它还带有一天中的某个时间、一个时区等等,所以我认为它不适合手头的工作。如果默认语言环境是泰语,则使用Calendar 的代码将给出不同的结果,这将是最令人惊讶的。 Calendar 类设计不佳且早已过时。

相反,我使用的是 java.time 的 LocalDate,这是现代 Java 日期和时间 API。

问题:我可以在 Java 7 上使用 java.time 吗?

我正在使用 Java 1.7 …

java.time 在 Java 7 上运行良好。它至少需要 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    【解决方案2】:

    仅使用日历并假设月份数是指零索引的月份,其中0 表示一月,以下是 2019 年 5 月 13 日的示例:

    Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.ENGLISH);
    c.set(Calendar.YEAR, 2019);
    c.set(Calendar.MONTH, 4);
    c.set(Calendar.DAY_OF_MONTH, 13);
    System.out.println(c.get(Calendar.DAY_OF_YEAR));
    

    编辑:正如 Ole V.V. 的回答所指出的,如果您调用“Calendar.getInstance()”,您将获得一个带有系统时区的日历对象,因此我将其更改为您明确指定要使用的时区和语言环境.如果您例如,后者很重要。想要获取世界不同地区规则不同的日期的周数。

    【讨论】:

      【解决方案3】:

      您可以将您的部分连接成String,并使用SimpleDateFormatter,例如:

      int year = 2019;
      int month = 1;
      int day = 23;
      
      String string = "" + year + "-" + month + "-" + day;
      DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      Date date = format.parse(string);
      Calendar calendar = Calendar.getInstance();
      calendar.setTime(date);
      System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
      

      示例适用于 2019 年 1 月 23 日。

      【讨论】:

      • 手动格式化和解析回来,这肯定是绕道而行。当问题询问设计不佳的Calendar 类时,您是在暗示同样过时且更麻烦的SimpleDateFormat。我建议不要这样做。
      猜你喜欢
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多