【问题标题】:How can I format a given date in Java using switch case?如何使用 switch case 格式化 Java 中的给定日期?
【发布时间】:2020-09-27 05:09:23
【问题描述】:

我需要格式化一个日期(月、年),但我做不到。

问题是: 给定以下数据
年份:2016
月:12
日期:31
接下来 N 天:5

产生以下输出:
“12 月有多达 31 天”
“今天日期:2016 年 12 月 31 日”
“明天的日期:2017 年 1 月 1 日”
“还有 5 天:2017 年 1 月 5 日”。

我如何使用 switch 语句来格式化这些日期(按照我的老师的要求)?

import java.util.Scanner;

import javax.lang.model.util.ElementScanner6;

public class TugasNo4 {
public static void main(String[] args) {
    int years, month, date, nday;
    String monthname = "";

    Scanner input = new Scanner(System.in);

    System.out.print("Tahun: ");
    years = input.nextInt();

    System.out.print("Bulan: ");
    month = input.nextInt();

    System.out.print("Tanggal: ");
    date = input.nextInt();
    if(date <= 0){
        System.out.println("Anda memasukkan tanggal yang salah!");
        input.close();
    }

    System.out.print("N hari kedepan: ");
    nday = input.nextInt();        

    switch(month){
        case 1:
        monthname = "Januari";
        System.out.println(monthname+" memiliki hari sebanyak 31 hari");            
        break;
        case 3:
        monthname = "Maret";
        System.out.println(monthname+" memiliki hari sebanyak 31 hari");            
        break;
        case 5:
        monthname = "May";
        System.out.println(monthname+" memiliki hari sebanyak 31 hari");            
        break;
        case 7:
        monthname = "July";
        System.out.println(monthname+" memiliki hari sebanyak 31 hari");            
        break;
        case 8:
        monthname = "Agustus";
        System.out.println(monthname+" memiliki hari sebanyak 31 hari");
        break;
        case 10:
        monthname = "Oktober";
        System.out.println(monthname+" memiliki hari sebanyak 31 hari");
        break;
        case 12:
        monthname = "Desember";
        System.out.println(monthname+" memiliki hari sebanyak 31 hari");
        break;
        case 4:
        monthname = "April";
        System.out.println(monthname+" memiliki hari sebanyak 30 hari");
        break;
        case 6:
        monthname = "Juni";
        System.out.println(monthname+" memiliki hari sebanyak 30 hari");
        break;
        case 9:
        monthname = "September";
        System.out.println(monthname+" memiliki hari sebanyak 30 hari");
        break;
        case 11:
        monthname = "November";
        System.out.println(monthname+" memiliki hari sebanyak 30 hari");
        break;
        case 2:
        monthname = "Februari";
        if((years % 4 == 0) && !(years % 100 == 0))
        System.out.println(monthname+" memiliki hari sebanyak 29 hari");     
        else 
        System.out.println(monthname+" memiliki hari sebanyak 28 hari");       
        break;            
        default:
        System.out.println("Anda memasukkkan bulan yang salah");
        break;
    }
    System.out.println("Hari ini tanggal: "+date+" "+monthname+" "+years);

    int datebesok = date + 1;
    System.out.println("Besok tanggal "+datebesok+" "+monthname+" "+years);

    int datenday = date + nday;
    if((month == 2) && (datenday <= 28) && (datenday <= 29)){
        System.out.println(nday+" hari lagi tanggal: "+datenday+" "+monthname+" "+years);
    }
  }
}

【问题讨论】:

  • 你不使用开关;你使用java.time 并说Month.of(month)Month 可以告诉你它与length 有多少天。
  • 对不起兄弟,我的老师让我使用开关盒
  • @우렉Mazino - 请您的老师为练习switch-case 做一些其他作业,因为这样做容易出错且过于复杂。

标签: java


【解决方案1】:

我建议您使用modern date-time API。从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int year, month, dayOfMonth, nDays;
        Scanner input = new Scanner(System.in);

        System.out.print("Enter year: ");
        year = input.nextInt();

        System.out.print("Enter month: ");
        month = input.nextInt();

        System.out.print("Enter day: ");
        dayOfMonth = input.nextInt();

        System.out.print("Enter next N days: ");
        nDays = input.nextInt();

        LocalDate date = LocalDate.of(year, month, dayOfMonth);
        String monthName = date.getMonth().getDisplayName(TextStyle.FULL, Locale.ENGLISH);

        System.out.println(monthName + " has as many days as " + date.getMonth().length(date.isLeapYear()) + " days");

        // Entered date
        System.out.println("Today's date: " + monthName + " " + ordinal(dayOfMonth) + " " + year);

        // Format for other dates
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM dd, uuuu", Locale.ENGLISH);

        System.out.println("Tomorrow's date: " + date.plusDays(1).format(formatter));

        System.out.println("After " + nDays + " days: " + date.plusDays(5).format(formatter));
    }

    static String ordinal(int num) {
        String[] suffix = { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" };
        int m = num % 100;
        return String.valueOf(num) + suffix[(m > 3 && m < 21) ? 0 : (m % 10)];
    }
}

示例运行:

Enter year: 2016
Enter month: 12
Enter day: 31
Enter next N days: 5
December has as many days as 31 days
Today's date: December 31st 2016
Tomorrow's date: January 01, 2017
After 5 days: January 05, 2017

注意:函数ordinal是从this answer复制而来的。

【讨论】:

  • 谢谢,但是我的老师告诉我要使用 switch case 和 if-else
【解决方案2】:

我相信你需要更改你的月份数据类型并输入到字符串输入,使用String month = input.nextLine();来获取一个字符串

【讨论】:

  • 比 switch 语句更简单的答案是使用java.time
  • 错误兄弟,我使用整数,因为输入是数字,输出是写在开关盒中
【解决方案3】:

首先找到明天的日期:您将 1 添加到月份的日期,date。然后检查它是否变得大于该月的天数(您已经知道如何找到该月的天数)。如果有,我们需要去下个月的第一天。将月份增加 1 并将月份中的日期设置为 1。现在我们需要检查月份是否大于一年中的月份数。如果是这样,增加年份并将月份设置为 1。

在 5 天后或用户输入的任意天数后查找日期类似,只是稍微复杂一些。添加适当的天数后,如果日期大于该月的天数,则减去该数字并增加月份。举个例子:如果日期是 31,月份是 12(十二月),你加 5 得到 36,你看到这大于 31,所以你减去 31 得到 5。像以前一样调整月份和年份后,我们有次年1月5日。我们还没有完成。用户可能输入了很多天,以至于我们也过了一月底。如果用户输入 594 天怎么办?所以我们需要在一个循环中进行检查,反复减去一个月的天数并调整月份和年份,直到我们遇到date小于或等于该月的天数的情况我们降落了。

PS 正如其他人所说,对于生产代码,人们应该并且应该使用 java.time、现代 Java 日期和时间 API 及其 LocalDate 类。但是作为一个练习,你当然应该按照老师说的去做,而且这是一个很好的练习,你肯定在学习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多