【问题标题】:Convert date string from "ddMMM" into "yyyy-MM-dd" using Java 8使用 Java 8 将日期字符串从“ddMMM”转换为“yyyy-MM-dd”
【发布时间】:2019-04-22 18:19:44
【问题描述】:

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

例如:“30SEP”-->“2019-09-30”和“15JAN”-->“2020-01-15”(如果日期是当年的过去,则取明年的日期)

【问题讨论】:

  • @Evan Mhm,看起来就像是新手提出的“为我做我的工作”问题之一。我有点厌倦了。恕我直言,回答无济于事......

标签: java simpledateformat datetime-format date-conversion localtime


【解决方案1】:

MonthDay

埃文的答案很好,但我建议您解析您的输入内容:一个月。有一堂课!见MonthDay。

DateTimeFormatter f = new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern( "ddMMM" ).toFormatter() ;
MonthDay md = MonthDay.parse( input , f ) ;

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

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;

比较。

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

【讨论】:

  • 支持,因为我学到了一些新东西(MonthDay 课程),但我相信您需要处理相同的 2 月 29 日问题?我观察到的是,Java 会将您的本地日期 2019 年 2 月 29 日更改为 2019 年 2 月 28 日。因此,将 target.plusYears(1) 替换为 md.atYear( today.plusYears(1).getYear() ) 可能是一个更强大的解决方案.
  • Java_prof,如果运行此代码的计算机位于您要推断的区域中,我使用不带区域的 LocalDate.now() 的答案有效,因为该重载使用系统时区。但如果没有,Basil 明确设置区域的代码将是必要的。
  • 我建议总是明确地传递一个时区。即使您想要 JVM 当前的默认时区,也请致电 ZoneId.systemDefault。否则,隐式依赖默认值的代码是不明确的,因为很多程序员要么不知道时区问题,要么忘记考虑时区问题。
【解决方案2】:

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

    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" ) );

【讨论】:

  • 我怀疑此代码在 2 月 29 日失败。但我还没有验证这个问题。
  • 你是对的,2019 年 29FEB 的结果返回 2020-02-28 原始写入。相应地更新。不知道 MonthDay,所以感谢您在回答中向我展示了一些新内容。
【解决方案3】:

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

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);
    }
}`

`

【讨论】:

  • 这些糟糕的日期时间类在几年前被值得采用 JSR 310 的 java.time 类所取代。
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2011-11-01
  • 2018-04-07
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多