从“转换日期字符串”;“ddMMM”;变成;yyyy-MM-dd“;使用Java8

从“转换日期字符串”;“ddMMM”;变成;yyyy-MM-dd“;使用Java8,java,simpledateformat,datetime-format,date-conversion,localtime,Java,Simpledateformat,Datetime Format,Date Conversion,Localtime,我们需要将日期字符串“ddMMM”转换为“yyyy-MM-dd” 例如:“9月30日”->“2019-09-30”和“1月15日”->“2020-01-15”(如果当前年份的日期为过去,则取下一年的日期)您可以将仅日期和月份的输入作为字符串数组。 使用获取当前日期 现在你有了两个价值观。。。比较两者并将年份添加到日期 import java.util.Calendar; import java.util.Scanner; public class DateCalendar { publ

我们需要将日期字符串“ddMMM”转换为“yyyy-MM-dd”


例如:“9月30日”->“2019-09-30”和“1月15日”->“2020-01-15”(如果当前年份的日期为过去,则取下一年的日期)

您可以将仅日期和月份的输入作为字符串数组。 使用获取当前日期 现在你有了两个价值观。。。比较两者并将年份添加到日期

import java.util.Calendar;
import java.util.Scanner;

public class DateCalendar {
    public static void main(String ar[]){
        String[] monthName = {"January", "February",
                "March", "April", "May", "June", "July",
                "August", "September", "October", "November",
                "December"};
        int count = 0;
        int presentMonth =0;
        int userMonth = 0;
        int finalYear = 0;


        Scanner sc = new Scanner(System.in);
        System.out.println("Enter Date :");
        int userdate = sc.nextInt();
        System.out.println("Enter Month :");
        String usrMonth = sc.next();

        Calendar now = Calendar.getInstance();
        int presentDate = now.get(Calendar.DATE);
        presentMonth = (now.get(Calendar.MONTH))+1;

        //Convert user input Month String to int
        count = 0;
        while(count<12){
            if(monthName[count].equals(usrMonth)){
                userMonth = count + 1;
                // array starts from 0
                break;
            }
            else{
                count++;
            }
        }

        //convert to final year and 
        if(userMonth<presentMonth){
            finalYear =  (now.get(Calendar.YEAR))+1;
        }
        else if(userMonth>presentMonth){
            System.out.println("THe userMonth is : "+userMonth+" and presentMonth is : "+presentMonth);
            finalYear = now.get((Calendar.YEAR));
        }
        else if(userMonth==presentMonth){
            if(userdate>=presentDate){
                finalYear = now.get((Calendar.YEAR));
            }
            else if(userdate<presentDate){
                finalYear =  (now.get(Calendar.YEAR))+1;
            }
        }

        System.out.println("THe final year is : "+finalYear);
        System.out.println("THe final month is "+monthName[userMonth-1]);
        System.out.println("the final date is : "+userdate);
    }
}`
import java.util.Calendar;
导入java.util.Scanner;
公共类日期日历{
公共静态void main(字符串ar[]{
字符串[]monthName={“一月”、“二月”,
“三月”、“四月”、“五月”、“六月”、“七月”,
“八月”、“九月”、“十月”、“十一月”,
“12月”};
整数计数=0;
int presentMonth=0;
int userMonth=0;
int finalYear=0;
扫描仪sc=新的扫描仪(System.in);
System.out.println(“输入日期:”);
int userdate=sc.nextInt();
System.out.println(“输入月份:”);
字符串usrMonth=sc.next();
Calendar now=Calendar.getInstance();
int presentDate=now.get(Calendar.DATE);
presentMonth=(now.get(Calendar.MONTH))+1;
//将用户输入的月份字符串转换为int
计数=0;
while(计数=当前日期){
finalYear=now.get((日历年));
}

else if(userdateDateTimeFormatter)是解析日期和时间的好工具,但它需要一年作为输入。这需要当前年份,但如果输出的日期早于现在,则添加一年

    String dateString = "29FEB";
    DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern("ddMMMyyyy").toFormatter();
    LocalDate dateOfInterest = LocalDate.parse( dateString + LocalDate.now().getYear(), dateTimeFormatter );
    if( dateOfInterest.isBefore( LocalDate.now() ) )
        dateOfInterest = LocalDate.parse( dateString + LocalDate.now().plusYears(1).getYear(), dateTimeFormatter );
然后LocalDate可以转换为字符串,格式如下所示

dateOfInterest.format( DateTimeFormatter.ofPattern( "yyy-MM-dd" ) );
MonthDay
Evan给出的答案很好,但我建议解析你的输入:一个月一天。有一个这样的类!参见

现在确定一个日期。为此,你需要一个时区。对于任何给定的时刻,全球各地的日期因区域而异

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
比较一下

LocalDate target = md.atYear( today.getYear() ) ;
if( target.isBefore( today ) ) {
    target.plusYears( 1 ) ;
} 

@埃文,看起来就像“为我做我的工作”来自新手的问题。我有点厌倦了。IMHO的回答没有帮助…这些糟糕的日期时间类在几年前被值得采用JSR 310的java.time类取代。我怀疑这段代码在2月29日失败。但我还没有验证这个问题。你是对的,2019年2月29日的结果是returns 2020-02-28,如原稿所示。相应更新。我不知道MonthDay,因此感谢您在回答中向我展示了一些新内容。自从我学到了一些新内容(MonthDay课程)后,我进行了升级投票,但我相信您需要处理2月29日的同一期?我观察到Java将把您的本地日期2019年2月29日改为2019年2月28日。因此,用md.atYear(today.plusYears(1.getYear())替换target.plusYears(1)可能是一个更健壮的解决方案。Java_教授,我的答案是使用LocalDate.now()如果运行此代码的计算机位于您想要推断的区域内,则“无区域”可以工作,因为该重载使用系统时区。但如果不是,则需要Basil的代码来显式设置区域。我建议始终显式传递时区。即使您想要JVM的当前默认时区,也可以调用
ZoneId、 systemDefault
。否则,隐式依赖默认值的代码是不明确的,因为许多程序员要么不知道时区问题,要么忘记了考虑时区问题。
LocalDate target = md.atYear( today.getYear() ) ;
if( target.isBefore( today ) ) {
    target.plusYears( 1 ) ;
}