给定日期的 return 星期几的 getDay() 方法不起作用

getDay() method to return day of the week for a given date not works

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

任务

You are given a date. You just need to write the method, getDay, which returns the day on that date.For example, if you are given the date, August 14th 2017, the method should return MONDAY as the day on that date.

我已尽力完成任务,但得到 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(Java8+)中的新类,以及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类。

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

使用 java.util 日期和日历格式化数据和时间如下,其中需要处理 java 中 java.text.SimpleDateFormat 的异常 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 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);
  }
}
    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。

您可以使用新的 Java8 日期时间 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();
}

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

如果你想使用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 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();
}