【问题标题】:getDay() method to return day of the week for a given date not worksgetDay() 方法返回给定日期的星期几不起作用
【发布时间】:2018-07-27 00:05:57
【问题描述】:

我正在尝试在 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());
    }
}

【问题讨论】:

  • LocalDate.of( 2017 , 8 , 14 ).getDayOfWeek().toString() —> 星期一
  • 除非您需要它来处理遗留代码,否则您可能在浪费时间学习过时的 API...
  • @BasilBourque 这是 Java 8,对吧?
  • @assylias 我刚刚开始在 HackerRank 上进行挑战。我是一个真正的编程新手,但我想最终成为一名优秀的有竞争力的程序员。如果你有更好的建议,我会很高兴听到它:)
  • @SaidBuyukarslan java.time 类内置于 Java 8 及更高版本中。在 ThreeTen-Backport 项目中,它们的大部分功能都向后移植到 Java 6 和 7。非常值得添加到您的项目中,因为遗留类是一团糟。搜索堆栈溢出以获取更多信息。这个问题已经解决了很多次了。

标签: java date dayofweek java.util.calendar


【解决方案1】:

您的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));
}

【讨论】:

  • 确实有效,谢谢!顺便说一句,我有两个小问题: 1. 在cal.set(Integer.valueOf(year), (Integer.valueOf(month) - 1), Integer.valueOf(day)); 行之后,Calendar.DAY_OF_WEEK 的值变为一周中的实际日期,而不是系统的当前日期,对吗?和 2. 如果我只想拥有当天的 int 值,最好使用 cal.get(Calendar.DAY_OF_WEEK) 进行字符串调用。比如:int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);(返回 1-7 之间的值)。
  • 一:Calendar.DAY_OF_WEEK 是一个static final 常量7。它不会“变成一周中的实际日期”,它永远不会改变。这是一个常数。二:看Calendar.SUNDAY,它是1。三:优先选择java.time中的课程而不是java.util.Calendar
  • 或者,您可以调用.getDayOfWeek().getDisplayName 来自动本地化星期几的名称,而不是调用.format
【解决方案2】:

java.time.LocalDate

现代方法使用 java.time 类。

  1. 导入java.time.* 以访问LocalDateDayOfWeek 类。
  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 项目。

【讨论】:

    【解决方案3】:

    使用 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);
      }
    }
    

    【讨论】:

    【解决方案4】:
        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。

    【讨论】:

    • 可以添加importstatementsimport java.time.LocalDate;import java.time.format.DateTimeFormatter;,那么方法中就不需要java.timejava.time.format这两个条件了。
    • 是的,你也可以这样做
    【解决方案5】:

    您可以使用新的 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 得到的相反。

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    【解决方案6】:

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

     import java.time.LocalDate;
    
     public static String getDay(int month, int day, int year) {
    
        return LocalDate.of(year, month, day).getDayOfWeek().name();
    
        }
    

    【讨论】:

    • 感谢您的贡献。这当然是一个很好的建议,我认为它已经在许多其他答案中(有非常细微的变化)。
    【解决方案7】:
    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();
    }
    

    【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 2021-06-29
    • 2011-03-02
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    相关资源
    最近更新 更多