【问题标题】:How to set a date as input in java?如何在java中设置日期作为输入?
【发布时间】:2021-10-28 03:52:18
【问题描述】:

是否有任何直接的方法可以将日期设置为变量但作为输入? 我的意思是我不知道设计时的日期,用户应该给它。 我尝试了以下代码,但它不起作用: Calendar myDate=new GregorianCalendar(int year, int month, int day);

【问题讨论】:

  • 查看用于处理用户输入的 Scanner 类。
  • 我不明白你为什么说“直接将日期设置为变量但作为输入”。你能说得具体点吗?
  • 我的意思是如果java定义的方法将参数作为变量,然后在运行时知道它们的值。
  • 仅供参考,GregorianCalendar 类现在是旧的,在 Java 8 及更高版本中被 ZonedDateTime 取代。或者,如果您只想要年月日而没有时间,请使用 LocalDateLocalDate.of( 2018 , 1 , 23 ) = 2018 年 1 月 23 日。

标签: java date calendar gregorian-calendar


【解决方案1】:

试试下面的代码。我正在解析输入的字符串以生成日期

// To take the input
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the Date ");

String date = scanner.next();

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
Date date2=null;
try {
    //Parsing the String
    date2 = dateFormat.parse(date);
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
System.out.println(date2);

【讨论】:

  • 这种方式能实现真正的约会吗?我的意思是,如果我输入错误的日期,它会接受吗?
  • 是的!确实如此。请确保您以正确的格式输入日期。我的意思是上面的例子如果我输入:35-MAR-1992 那么结果将是:Sat Apr 04 00:00:00 PST 1992
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 和 Java 中内置的 java.time 类所取代9. 见Tutorial by Oracle
【解决方案2】:

tl;博士

 LocalDate.of( 2026 , 1 , 23 )  // Pass: ( year , month , day )

java.time

其他一些答案在展示如何从用户那里收集输入方面是正确的,但使用了麻烦的旧日期时间类,这些类现在是遗留的,被 java.time 类所取代。

LocalDate

对于没有时间和时区的仅日期值,请使用LocalDate 类。

LocalDate ld = LocalDate.of( 2026 , 1 , 23 );

将您的输入字符串解析为整数,如下所述:How do I convert a String to an int in Java?

int y = Integer.parseInt( yearInput );
int m = Integer.parseInt( monthInput );  // 1-12 for January-December.
int d = Integer.parseInt( dayInput );

LocalDate ld = LocalDate.of( y , m , d );


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案3】:

    也许你可以试试我下面的简单代码:

    SimpleDateFormat dateInput = new SimpleDateFormat("yyyy-MM-dd");
    Scanner input = new Scanner(System.in);
    
    String strDate = input.nextLine();
    
    try
    {
       Date date = dateInput.parse(strDate);
       System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
    } 
    catch (ParseException e) 
    {
       System.out.println("Parce Exception");
    }
    

    【讨论】:

    • 感谢您的贡献。请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。
    【解决方案4】:

    java.time

    我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。大多数其他答案中使用的DateSimpleDateFormat 类设计不良且早已过时。不要使用它们。

    我进一步建议用户希望以特定于其区域设置的短格式输入日期。为此,我首先声明了一些常量:

    private static final Locale defaultFormattingLocale
            = Locale.getDefault(Locale.Category.FORMAT);
    private static final String defaultDateFormat = DateTimeFormatterBuilder
            .getLocalizedDateTimePattern(FormatStyle.SHORT, null, 
                    IsoChronology.INSTANCE, defaultFormattingLocale);
    private static final DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern(defaultDateFormat, defaultFormattingLocale);
    

    现在提示和读取日期如下:

        Scanner inputScanner = new Scanner(System.in);
        
        LocalDate sampleDate
                = Year.now().minusYears(1).atMonth(Month.NOVEMBER).atDay(26);
        System.out.println("Enter date in " + defaultDateFormat
                + " format, for example " + sampleDate.format(dateFormatter));
        String dateString = inputScanner.nextLine();
        try {
            LocalDate inputDate = LocalDate.parse(dateString, dateFormatter);
            System.out.println("Date entered was " + inputDate);
        } catch (DateTimeParseException dtpe) {
            System.out.println("Invalid date: " + dateString);
        }
    

    美国地区的示例会话:

    Enter date in M/d/yy format, for example 11/26/20
    2/9/21
    Date entered was 2021-02-09
    

    丹麦语区域的示例会话:

    Enter date in dd/MM/y format, for example 26/11/2020
    9/februar/2021
    Invalid date: 9/februar/2021
    

    在最后一种情况下,您可能希望允许用户重试。我把它留给你。

    链接

    Oracle tutorial: Date Time 解释如何使用 java.time。

    【讨论】:

    • 不错! 对于未来的访问者: 在上面给出的代码中,LocaledateFormatter 一起使用不一定必须与用于获取 defaultDateFormat 的相同。例如,String format = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.FULL, null, IsoChronology.INSTANCE, Locale.FRANCE); LocalDate now = LocalDate.now(); System.out.println(now.format(DateTimeFormatter.ofPattern(format, Locale.ENGLISH))); System.out.println(now.format(DateTimeFormatter.ofPattern(format, Locale.FRANCE)));
    【解决方案5】:

    看看这个:)

     ZoneId defaultZoneId = ZoneId.systemDefault();
     Scanner scanner = new Scanner(System.in);
    
     System.out.print("Enter the DOB: ");
     String dobString = scanner.nextLine();
    
     LocalDate dobLocal = LocalDate.parse(dobString);
     Date dob = Date.from(dobLocal.atStartOfDay(defaultZoneId).toInstant());
     System.out.println(dob);
    

    简单项目 GitHub 仓库:https://github.com/lojithv/Java-Enter-Student-Details.git

    你应该像这样输入dob:yyyy-mm-dd

    完成:)

    【讨论】:

      【解决方案6】:

      我修改了@SK08 的答案并创建了一个方法,该方法将年、月和日期作为用户输入并返回日期。

          Scanner scanner = new Scanner(System.in);
          String str[] = {"year", "month", "day" };
          String date = "";
      
          for(int i=0; i<3; i++) {
              System.out.println("Enter " + str[i] + ": ");
              date = date + scanner.next() + "/";
          }
          date = date.substring(0, date.length()-1);
          System.out.println("date: "+ date); 
      
          SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
          Date parsedDate = null;
      
          try {
              parsedDate = dateFormat.parse(date);
          } catch (ParseException e) {
              e.printStackTrace();
          }
          return parsedDate;
      

      【讨论】:

        【解决方案7】:

        这是评论的转贴。我完全信任 Arvind Kumar Avinash。 @arvindkumaravinash “很好!对于未来的访问者:在上面给出的代码中,与 dateFormatter 一起使用的 Locale 不一定必须与用于获取 defaultDateFormat 的 Locale 相同。例如,

        String format = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
                FormatStyle.FULL, null, IsoChronology.INSTANCE, Locale.FRANCE);
        LocalDate now = LocalDate.now();
        System.out.println(
                now.format(DateTimeFormatter.ofPattern(format, Locale.ENGLISH)));
        System.out.println(
                now.format(DateTimeFormatter.ofPattern(format, Locale.FRANCE)));
        

        " 对于美国人,请务必将 FRANCE 替换为 US,英国人使用 UK,等等。这是当前使用的国家/地区的列表。 https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html

        还要确保单独导入所有必需的包,因为 time* 对此不起作用。所以这些本质上

        import java.time.format.DateTimeFormatter;
        import java.time.format.DateTimeFormatterBuilder;
        import java.util.Locale;
        import java.time.format.FormatStyle;
        import java.time.chrono.IsoChronology;
        

        【讨论】:

        • 我只是想让 arvind 获得一些信任,并包括如果您不在法国,您需要输入正确的国家/地区。 @arvind
        【解决方案8】:

        这应该可以正常工作,您也可以使用 setlenient 函数验证日期-

        import java.text.ParseException;
        import java.text.SimpleDateFormat;
        import java.util.ArrayList;
        import java.util.Date;
        import java.util.Scanner;
        
        public class Datinput {
        
            public static void main(String args[]) {
                int n;
                ArrayList<String> al = new ArrayList<String>();
                Scanner in = new Scanner(System.in);
                n = in.nextInt();
                String da[] = new String[n];
                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
                sdf.setLenient(false);
                Date date[] = new Date[n];
                in.nextLine();
                for (int i = 0; i < da.length; i++) {
                    da[i] = in.nextLine();
                }
                for (int i = 0; i < da.length; i++) {
        
                    try {
                        date[i] = sdf.parse(da[i]);
                    } catch (ParseException e) {
        
                        e.printStackTrace();
                    }
                }
        
                in.close();
            }
        }
        

        【讨论】:

          【解决方案9】:

          我试过了!

          package javaapplication2;
          //@author Ibrahim Yesilay
          import java.text.ParseException;
          import java.text.SimpleDateFormat;
          import java.util.Date;
          import java.util.Scanner;
          public class JavaApplication2 {  
              public static void main(String[] args) throws ParseException {
              Scanner giris = new Scanner(System.in);        
                  System.out.println("gün:");
                  int d = giris.nextInt();
                  System.out.println("ay:");
                  int m = giris.nextInt();
                  System.out.println("yil:");
                  int y = giris.nextInt();
                  String tarih;
                  tarih = Integer.toString(d) + "/" + Integer.toString(m) + "/" + Integer.toString(y);  
                  System.out.println("Tarih : " + tarih); 
                  SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
                  Date girilentarih = null;
                  girilentarih = dateFormat.parse(tarih);
                  System.out.println(dateFormat.format(girilentarih));      
              }   
          }
          

          【讨论】:

            猜你喜欢
            • 2020-09-18
            • 2021-09-04
            • 1970-01-01
            • 2011-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多