计算以空格分隔的两个日期之间的 13 号星期五

问题描述 投票:0回答:5
Date startdate=new Date();
Date enddate=new Date();
DateFormat format = new SimpleDateFormat("dd MM yyyy",Locale.US);


Scanner scanner = new Scanner(System.in);    
String line = scanner.nextLine();
String line1 = scanner.nextLine();

try{
    startdate = format.parse(line);
} 
 catch(ParseException e){
    System.out.println("Sorry!!");
}

try {
    enddate = format.parse(line1);
} 
catch(ParseException e){
    System.out.println("Sorry!!");
}

如果我的日期在两行单独的行中给出,那么我的代码可以正常工作。但我想让它适用于以空格分隔的同一行中的输入(两个日期之间以及日月年之间(每个日期的 DD MM YYYY 格式))。

输入如下:01 01 2015 10 10 2015

我需要分别扫描startdate和enddate中的这两个日期。我该怎么办?

java date
5个回答
1
投票

你可以使用

substring

  String Str = new String("01 01 2015 10 10 2015");

  System.out.println(Str.substring(11) );   // 10 10 2015

  System.out.println(Str.substring(0, 10) );  // 01 01 2015

0
投票

这是您应该如何执行此操作的指南。我希望您编写自己的代码。

  • 将输入输入到字符串中。 (一行包含两个日期)
  • 将字符串在中间的空格处分开。
  • 然后将每个零件送入
    format.parse();

0
投票

如果您不知道字符串的确切长度,即可以将 Jan 1st 2015 作为

1 1 2015
或中间的其他字符(例如多个空格)传递,请尝试使用正则表达式:

String input = "1 1 2015   10 10 2015";

SimpleDateFormat f = new SimpleDateFormat("dd MM yyyy");

Pattern p = Pattern.compile( "[0-9]{1,2} [0-9]{1,2} [0-9]{4}" );
Matcher m = p.matcher( input );

while( m.find() )
{
  System.out.println( f.parse( m.group() ) );
}

表达式的简短分解:

  • [0-9]{1,2}
    表示一个或两个 ASCII 数字(
    \d
    也可以匹配非 ASCII 数字)
  • [0-9]{4}
    表示正好四个 ASCII 数字
  • 数字组由一个空格分隔,即它们与粗略模式匹配
    x y z
    ,任何中间有多个空格的输入都不会匹配。

0
投票

好吧,直接一对一地获取您的代码。这就是你应该如何做的。

    Scanner scanner = new Scanner(System.in);    
    String line = scanner.nextLine();
    Pattern pattern = Pattern.compile("[0-9]{1,2}\\s+[0-9]{1,2}\\s+[0-9]{4}");
    Matcher m = pattern.matcher(line);

    String d1 = null;
    String d2 = null;

    DateFormat format = new SimpleDateFormat("dd MM yyyy",Locale.US);

    Date startDate = null;
    Date endDate = null;

    try {
        if(m.find()) {
            d1 = m.group();
            startDate = format.parse(d1);
        } else {
            System.out.println("Sorry for date 1.");
        }
        if(m.find()) {
            d2 = m.group();
            endDate = format.parse(d2);
        } else {
            System.out.println("Sorry for date 2.");
        }
    } catch (ParseException e) {
        System.out.println("Incorrect date format");
    }

0
投票

解析

你说你有一个格式为

DD MM YYYY DD MM YYYY
的字符串。我会简单地将这个输入分成六个部分,使用前三个部分来创建一个日期,最后三个部分作为另一个日期。

String input = "01 01 2015 10 10 2015";
String[] parts = input.split ( " " );
int d1 = Integer.parseInt ( parts[ 0 ] );
int m1 = Integer.parseInt ( parts[ 1 ] );
int y1 = Integer.parseInt ( parts[ 2 ] );
int d2 = Integer.parseInt ( parts[ 3 ] );
int m2 = Integer.parseInt ( parts[ 4 ] );
int y2 = Integer.parseInt ( parts[ 5 ] );

java.time

在现代 Java 中,切勿使用

Date
Calendar
SimpleDateFormat
。这些存在严重缺陷的类是遗留类,被 Java 8+ 中内置的 java.time 类所取代,并在 JSR 310 中定义。

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

java.time.LocalDate
类。

LocalDate start = LocalDate.of ( y1 , m1 , d1 ) ;
LocalDate end = LocalDate.of ( y2 , m2 , d2 ) ;

获取该范围内所有日期的Stream。筛选出第 13 个。并过滤那些星期五。

List < LocalDate > fridaysTheThirteenth =
        start
                .datesUntil ( end )
                .filter ( date -> date.getDayOfMonth ( ) == 13 )
                .filter ( date -> date.getDayOfWeek ( ) == DayOfWeek.FRIDAY )
                .toList ( );

第十三号星期五 = [2015-02-13, 2015-03-13]

© www.soinside.com 2019 - 2024. All rights reserved.