我正在尝试在HackerRank上完成名为 Java日期和时间的任务。
任务
你有一个约会。你只需要编写方法getDay即可 返回该日期的日期。例如,如果您获得日期, 2017年8月14日,该方法应该返回星期一作为该日 日期。
我尽力完成任务,但收到null
结果或NullPointerException
错误。我想知道我哪里做错了。以下是我的代码:
提前致谢!
我的代码:
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String month = in.next();
String day = in.next();
String year = in.next();
System.out.println(getDay(day, month, year));
}
public static String getDay(String day, String month, String year) {
Calendar cal = Calendar.getInstance();
cal.set(Integer.valueOf(year), (Integer.valueOf(month) - 1), Integer.valueOf(day));
return cal.getDisplayName(cal.get(Calendar.DAY_OF_WEEK), Calendar.LONG, Locale.getDefault());
}
}
答案 0 :(得分:8)
您的return
已关闭;您不希望cal.get
的第一列中有cal.getDisplayName
。目前,我使用您的代码获取月份名称。将其更改为
return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
并称之为
public static void main(String[] args) {
System.out.println(getDay("14", "8", "2017"));
}
我得到(正如预期的那样)
Monday
在新代码中,我首选 java.time
(Java 8+)中的新类,以及DateTimeFormatter
- 类似
public static String getDay(String day, String month, String year) {
int y = Integer.parseInt(year), m = Integer.parseInt(month), d = Integer.parseInt(day);
return java.time.format.DateTimeFormatter.ofPattern("EEEE")
.format(LocalDate.of(y, m, d));
}
答案 1 :(得分:3)
java.time.LocalDate
现代方法使用 java.time 类。
java.time.*
以访问LocalDate
和DayOfWeek
类。getDay
方法,该方法应该是静态的,因为它是在main方法中调用的。of
方法检索localDate,该方法采用“ int”格式的3个参数。getDay
方法参数。getDayOfWeek
方法检索当天的名称。有一个关于这一挑战的视频。 Java Date and Time Hackerrank
LocalDate // Represent a date-only value, without time-of-day and without time zone.
.of( 2018 , 1 , 23 ) // Pass year-month-day, 1-12 for January-December.
.getDayOfWeek() // Obtain a `DayOfWeek` enum object.
.getDisplayName( // Automatically localize the name of the day-of-week.
TextStyle.FULL , // How long or abbreviated.
Locale.US // Or Locale.CANADA_FRENCH or so on.
) // Returns `String` such as `Monday` or `lundi`.
对于Java 6和7,请参见 ThreeTen-Backport 项目。对于早期的Android,请参见 ThreeTenABP 项目。
答案 2 :(得分:1)
public static String getDay(int month, int day, int year) {
String res= java.time.format.DateTimeFormatter.ofPattern("EEEE")
.format(java.time.LocalDate.of(year, month, day));
return res; }
必须使用java.time.LocalDate,如果u将直接使用LocalDate,则其显示编译时间错误,即找不到符号,因此请使用java.time。
答案 3 :(得分:1)
您可以使用新的Java8 DateTime API。
public static String getDay(int day, int month, int year)
{
LocalDate dt=LocalDate.of(year, month, day);
System.out.println("day: " + dt.getDayOfWeek().toString());
return dt.getDayOfWeek().toString();
}
LocalDate
是一个没有一天中的时间的日期,对于我们的目的来说很好。 of
工厂方法构造所需的日期。与问题中使用的Calendar
类相反,它从1月的1到12月的12合理地对月份进行了编号。 LocalDate
在星期几有一个吸气剂。它从DayOfWeek
枚举返回一个常量,该常量的toString
方法为我们提供了一个很好的可读字符串,例如MONDAY
,这与我们从Calendar
获得的相反。
答案 4 :(得分:1)
如果您想使用LocalDate,可以以这种方式使用
import java.time.LocalDate;
public static String getDay(int month, int day, int year) {
return LocalDate.of(year, month, day).getDayOfWeek().name();
}
答案 5 :(得分:1)
public static String findDay(int month, int day, int year) {
Calendar cal = Calendar.getInstance();
cal.set(year, (month - 1), day);
String dayOfWeek = cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
return dayOfWeek.toUpperCase();
}
答案 6 :(得分:0)
public static void main(String[] args){
String inputDateStr = String.format("%s/%s/%s", 23, 04, 1995);
Date inputDate = null;
try {
inputDate = new SimpleDateFormat("dd/MM/yyyy").parse(inputDateStr);
} catch (ParseException ex) {
Logger.getLogger(JavaApplication28.class.getName()).log(Level.SEVERE, null, ex);
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(inputDate);
String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase();
System.out.println(dayOfWeek);
}