使用CALENDAR将月份和日期数字转换为一年中的日期

时间:2019-01-23 14:46:10

标签: java date calendar

我有两个数字。 首先是月份号。 第二个是天数。

我也知道年份。

如何将月份和日期这两个数字取为单一数字DAY_OF_YEAR?

我正在使用Java 1.7和Calendar函数。

3 个答案:

答案 0 :(得分:1)

通过ThreeTen Backport的java.time

    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);

此代码段的输出为:

  

一年中的第271天

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

考虑避免使用Calendar类

此处创建和设置Calendar对象的当前接受的答案的四行仅替换为一行。使用Calendar的代码通常过于冗长,这是我们不希望的。同样,尽管Calendar对象的名称不仅仅是日历日期,它还带有一天中的某个时间,一个时区以及更多内容,因此我认为它不适合手头的工作。如果默认语言环境为Thai,则使用Calendar的代码将给出不同的结果,这将使大多数人感到惊讶。 Calendar类的设计很差,已经过时了。

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

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

  

我正在使用Java 1.7…

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

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

链接

答案 1 :(得分:0)

仅使用日历并假设月份数为零,其中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 VV的答案指出的那样,如果您调用“ Calendar.getInstance()”,则将获得带有系统时区的Calendar对象,因此我对其进行了更改,以便您明确指定要使用的时区和语言环境。 。如果您例如想要获取日期的星期数,其中世界各地的规则都不同。

答案 2 :(得分:0)

您可以将零件合并为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日。