7

我正在尝试在 HackerRank 上完成名为Java 日期和时间的任务。

任务

给你一个约会。您只需要编写方法 getDay,它返回该日期的日期。例如,如果给定日期 2017 年 8 月 14 日,该方法应返回 MONDAY 作为该日期的日期。

我尽力完成任务,但我得到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());
    }
}
4

7 回答 7

12

return的已关闭;你不想cal.getcal.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));
}
于 2018-02-16T05:45:47.610 回答
3

java.time.LocalDate

现代方法使用java.time类。

  1. 导入java.time.*访问LocalDateDayOfWeek类。
  2. 编写getDay应该是静态的方法,因为它是在 main 方法中调用的。
  3. of使用采用“int”格式的 3 个参数的方法检索 localDate 。
  4. getDay方法参数转换为 int 格式。
  5. 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项目。

于 2018-09-30T07:10:35.120 回答
3

如果要使用LocalDate,可以这样使用

 import java.time.LocalDate;

 public static String getDay(int month, int day, int year) {

    return LocalDate.of(year, month, day).getDayOfWeek().name();

    }
于 2020-06-16T14:34:44.330 回答
1

使用 java.util 日期和日历格式化数据和时间如下,它需要在 java 7 中使用 java.text.SimpleDateFormat 处理异常。

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 8 中使用 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);
  }
}
于 2018-10-06T10:27:06.073 回答
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,如果你直接使用LocalDate,它会显示编译时错误,即找不到符号,所以请使用java.time。

于 2019-09-28T17:07:58.513 回答
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();
}

ALocalDate是一个没有时间的日期,非常适合我们的目的。工厂方法构造我们想要的of日期。与Calendar问题中使用的类相反,它从一月的 1 到十二月的 12 对月份进行了合理的编号。ALocalDate有一个星期几的吸气剂。它从DayOfWeek枚举中返回一个常量,其toString方法为我们提供了一个可读性很好的字符串,例如MONDAY, 再次与我们从中得到的. 形成对比Calendar

于 2020-05-12T17:41:00.323 回答
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();
}
于 2020-12-25T04:13:16.740 回答