题目来源于力扣(LeetCode)
一、题目
题目相关标签:数学
提示:
- date.length == 10
- date[4] == date[7] == '-',其他的 date[i] 都是数字。
- date 表示的范围从 1900 年 1 月 1 日至 2019 年 12 月 31 日。
二、解题思路
2.1 Calendar 类
-
解析 date 字符串,得到年、月、日整型元素
-
调用
Calendar
类的set
方法,完成日期的设置 -
调用
Calendar
类的get
方法,通过Calendar.DAY_OF_YEAR
属性获取到日期为一年中的第几天
2.2 数学计算
-
解析 date 字符串,得到年、月、日整型元素
-
日期相加,返回结果
三、代码实现
3.1 Calendar 类
public static int dayOfYear(String date) {
String[] strs = date.split("-");
int year = Integer.valueOf(strs[0]);
int month = Integer.valueOf(strs[1]);
int day = Integer.valueOf(strs[2]);
if (month == 1) {
return day;
}
Calendar calendar = Calendar.getInstance();
// 调用 set 方法
calendar.set(year, month - 1, day);
// Calendar.DAY_OF_YEAR 获取到一年中的第几天
return calendar.get(Calendar.DAY_OF_YEAR);
}
3.2 数学计算
public static int dayOfYear3(String date) {
String[] strs = date.split("-");
int year = Integer.valueOf(strs[0]);
int month = Integer.valueOf(strs[1]);
int day = Integer.valueOf(strs[2]);
if (month == 1) {
return day;
}
int days = day;
// 非闰年时的月份天数
int[] dayOfMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int tempMonth = month - 1; // 2019.1.9,结果为 9
// 计算月份天数
while (tempMonth > 0) {
tempMonth -= 1;
days += dayOfMonth[tempMonth];
}
if (month > 2) {
// 闰年时需要加 1
if ((year % 4 == 0 && year % 100 != 0)
|| (year % 100 == 0 && year % 400 == 0)) {
days += 1;
}
}
return days;
}
四、执行用时
4.1 Calendar 类
leetcode 中无法使用 Calendar API,执行报错
4.2 数学计算
五、部分测试用例
public static void main(String[] args) {
String date = "2019-01-09"; // output: 9
// String date = "2019-02-10"; // output: 41
// String date = "2003-03-01"; // output: 60
// String date = "2004-03-01"; // output: 61
int result = dayOfYear(date);
System.out.println(result);
}