我正在尝试完成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());
}
}
您的 return
不在;您不需要cal.getDisplayName
的第一列中的cal.get
。目前,我获得了您的代码的月份名称。将其更改为
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));
}
java.time.LocalDate
现代方法使用 java.time 类。
- 导入
java.time.*
访问LocalDate
&DayOfWeek
课程。 - 写
getDay
方法应该是静态的,因为它在主要方法中称为 - 使用
of
方法检索localdate,以" int"格式采用3个参数。 - 以int格式转换
getDay
方法参数。 - 最终使用
getDayOfWeek
方法检索当天的名称。
有一个有关此挑战的视频。Java日期和时间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 项目。
如果要使用localdate,则可以这样使用
import java.time.LocalDate;
public static String getDay(int month, int day, int year) {
return LocalDate.of(year, month, day).getDayOfWeek().name();
}
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,如果您将使用Direct LocalDate的show compile compile时间错误,即找不到符号,所以请使用java.time。
您可以使用新的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日的1月1日。LocalDate
在一周中的一天中有一个收获。它从DayOfWeek
枚举中返回一个常数,其toString
方法为我们提供了一个不错的可读字符串,例如MONDAY
,与我们从Calendar
获得的相反。
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();
}
使用java.util日期和日历进行格式化数据和时间,如下所示,它需要使用Java.text.simpledateformat在Java 7中处理异常。
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);
}
使用Java.Time类格式化日期和时间,如下所示,它是不变的,线程安全。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDateTime dateObj = LocalDateTime.now();
System.out.println("Before formatting: " + dateObj);
DateTimeFormatter formatObj = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
String formattedDate = dateObj.format(formatObj);
System.out.println("After formatting: " + formattedDate);
}
}
public static String findDay(int month, int day, int year) {
Calendar rightNow = Calendar.getInstance();
rightNow.set(year, month-1, day);;
switch(rightNow.get(Calendar.DAY_OF_WEEK)) {
case Calendar.SUNDAY:
return "SUNDAY";
case Calendar.MONDAY:
return "MONDAY";
case Calendar.TUESDAY:
return "TUEDAY";
case Calendar.WEDNESDAY:
return "WEDNESDAY";
case Calendar.THURSDAY:
return "THURSDAY";
case Calendar.FRIDAY:
return "FRIDAY";
case Calendar.SATURDAY:
return "SATURDAY";
}
}