代码之家  ›  专栏  ›  技术社区  ›  Faiq Irfan

如何在Java中更改日历实例的日期?

  •  2
  • Faiq Irfan  · 技术社区  · 7 年前

    DayOfWeek 它从用户那里获取日期并打印该日期的星期几。

    MM DD YYYY

    07 22 2016
    

    输出应该是

    星期五

    public class DayOfWeek{
        public static void main(String[] args){
            System.out.println("Enter the date (Format: MM DD YYYY) :");
            Scanner sc = new Scanner(System.in);
            String month = sc.next();
            String day = sc.next();
            String year = sc.next();
            int m = Integer.parseInt(month);
            int d = Integer.parseInt(day);
            int y = Integer.parseInt(year);
            Calendar cal = Calendar.getInstance();
            Date date = new Date(y, m, d);
            cal.setTime(date);
            int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
            SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
            System.out.println((sdf.format(dayOfWeek)).toUpperCase());
        }
    }
    

    07 22 2016 ),我没有获得所需的输出( FRIDAY

    3 回复  |  直到 7 年前
        1
  •  7
  •   Jon Skeet    7 年前

    您当前正在通过 int SimpleDateFormat Date 价值你不需要 Calendar 无论如何:

    // BAD CODE: DON'T USE - KEEP READING
    import java.text.*;
    import java.util.*;
    
    public class DayOfWeek {
        public static void main(String[] args){
            System.out.println("Enter the date (Format: MM DD YYYY) :");
            Scanner sc = new Scanner(System.in);
            String month = sc.next();
            String day = sc.next();
            String year = sc.next();
            int m = Integer.parseInt(month);
            int d = Integer.parseInt(day);
            int y = Integer.parseInt(year);
            // Note the changes here
            Date date = new Date(y - 1900, m - 1, d);
            SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
            System.out.println(sdf.format(date).toUpperCase());
        }
    }
    

    我之所以在这里发出警告,是因为您使用的是一个不推荐使用的日期构造函数,而且它之所以不推荐使用是有充分理由的。大体上 java.util.Date 可怕的 API,如果可能的话,应该避免使用它。您最初致电 new Date(y, m, d) 由于第一个参数 java.util.Date(int, int, int) 表示以1900为基数的年份(因此117表示2017年),第二个参数表示以0为基数的月份(因此6表示7月)。然后是隐式时区转换,这是你真正不想要的。

    最好使用 java.time ,在这种情况下 LocalDate

    import java.time.*;
    import java.time.format.*;
    import java.util.*;
    
    public class DayOfWeek {
        public static void main(String[] args){
            System.out.println("Enter the date (Format: MM DD YYYY) :");
            Scanner sc = new Scanner(System.in);
            String month = sc.next();
            String day = sc.next();
            String year = sc.next();
            int m = Integer.parseInt(month);
            int d = Integer.parseInt(day);
            int y = Integer.parseInt(year);
            LocalDate date = LocalDate.of(y, m, d);
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE");
            System.out.println(formatter.format(date).toUpperCase());
        }
    }
    

    最后,您解析用户输入的方法也不理想-我建议使用 DateTimeFormatter 为此:

    import java.time.*;
    import java.time.format.*;
    
    public class DayOfWeek {
        public static void main(String[] args){
            System.out.println("Enter the date (Format: MM DD YYYY) :");
            DateTimeFormatter parser = DateTimeFormatter.ofPattern("MM dd yyyy");
            Scanner sc = new Scanner(System.in);
            String line = sc.nextLine();
            LocalDate date = LocalDate.parse(line, parser);
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE");
            System.out.println(formatter.format(date).toUpperCase());
        }
    }
    
        2
  •  0
  •   Rahul Singh    7 年前
    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
    

    如果您需要将输出设置为星期二而不是3(一周中的几天从(1)开始编制索引),则只需重新格式化 string: new SimpleDateFormat("EE").format(date) (EE意思是“一周中的一天,短版本”)。

    正如Jon所指出的那样,尝试使用最新的日期时间格式化程序Api来实现这一目的,日期Api已被去除。

    如果您的输入是字符串,而不是日期,那么应该使用SimpleDataFormat对其进行解析

    : new SimpleDateFormat("dd/M/yyyy").parse(dateString)
    
        3
  •  0
  •   user7605325 user7605325    7 年前

    @JonSkeet's answer java.time 课程。

    如果你只是想得到一个 String 对于星期几,您可以跳过创建 LocalDate 并直接获得 java.time.DayOfWeek

    第一部分是相同的(从 Scanner DateTimeFormatter 解析它)。

    使用 from 方法所以我打电话 getDisplayName java.time.format.TextStyle (相当于 EEEE 在中设置格式 )和a java.util.Locale 为了明确起见,我想要一周中某一天的英文名字。

    // read line from input
    Scanner sc = new Scanner(System.in);
    // get "07 22 2016" from the scanner
    String line = sc.nextLine();
    // formatter to parse the input
    DateTimeFormatter parser = DateTimeFormatter.ofPattern("MM dd yyyy");
    // get the day of the week
    DayOfWeek dow = DayOfWeek.from(parser.parse(line));
    // get day of week's name
    String output = dow.getDisplayName(TextStyle.FULL, Locale.ENGLISH).toUpperCase();
    

    output 变量将为 FRIDAY toUpperCase() ,因为 Friday .

    这个 Locale 也很重要。如果不指定区域设置,它将使用系统的默认设置,并且 。即使在运行时,它也可以在没有通知的情况下进行更改,因此最好在代码中显式地进行更改。


    笔记:

    • 如果您想更改语言(只需使用不同的 dow.toString() ,也将返回

    • 星期五 (例如检查日期、月份等),然后您需要 @JonSkeet's solution 本地日期 有方法 getDayOfWeek() DayOfWeek ,以防万一)。

    • java.time ThreeTen Backport 。唯一的区别是包名( org.threeten.bp 而不是 java.time 姓名 都是一样的。