Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果月份是3个字母的字符串,如何计算两个日期之间的年数_Java_Scala_Datetime_Jodatime - Fatal编程技术网

Java 如果月份是3个字母的字符串,如何计算两个日期之间的年数

Java 如果月份是3个字母的字符串,如何计算两个日期之间的年数,java,scala,datetime,jodatime,Java,Scala,Datetime,Jodatime,我有2个日期,格式如下,其中月份是3个字母的字符串 1988年7月21日 2016-12-18 如何计算上述格式中日期之间的年数 当月份是一个整数时,我可以使用Joda time(如下所示)计算年份中日期之间的差异 val y = Years.yearsBetween(new LocalDate("1988-12-21"), new LocalDate("2016-1-18")) println( y.getYears) Output: 27 可以使用的蛮力方法只是将字母字符串转换为正确的in

我有2个日期,格式如下,其中月份是3个字母的字符串

1988年7月21日

2016-12-18

如何计算上述格式中日期之间的年数

当月份是一个整数时,我可以使用Joda time(如下所示)计算年份中日期之间的差异

val y = Years.yearsBetween(new LocalDate("1988-12-21"), new LocalDate("2016-1-18"))
println( y.getYears)
Output: 27

可以使用的蛮力方法只是将字母字符串转换为正确的int值。可以使用数组,如下所示

String[11] months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
然后,您可以循环查找当前月份与其中一个月的匹配时间,并将i val+1作为零基

在我看来,这比必须写出12条if语句要好

for (int i = 0; i < months.length; i++) {
     //where monthStr is a String that is the 3 letter month representaton
     if (monthStr = months[i]) {
         int monthInt = i + 1;
     }

}

您可以使用的暴力方法是将字母字符串转换为正确的int值。可以使用数组,如下所示

String[11] months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
然后,您可以循环查找当前月份与其中一个月的匹配时间,并将i val+1作为零基

在我看来,这比必须写出12条if语句要好

for (int i = 0; i < months.length; i++) {
     //where monthStr is a String that is the 3 letter month representaton
     if (monthStr = months[i]) {
         int monthInt = i + 1;
     }
}

您可以使用调用方法。大概

val y = Years.yearsBetween(
        LocalDate.parse("1988-Jul-21", DateTimeFormat.forPattern("yyyy-MMM-dd")),
        LocalDate.parse("2016-Dec-18", DateTimeFormat.forPattern("yyyy-MMM-dd")))
您可以使用来调用该方法。大概

val y = Years.yearsBetween(
        LocalDate.parse("1988-Jul-21", DateTimeFormat.forPattern("yyyy-MMM-dd")),
        LocalDate.parse("2016-Dec-18", DateTimeFormat.forPattern("yyyy-MMM-dd")))

下面是如何继续使用纯Java 8来解析日期:

// The formatter to use when parsing the dates with a locale 
// defined to prevent failures on non english environment
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd", Locale.US);
System.out.println(
    ChronoUnit.YEARS.between(
        LocalDate.parse("1988-Jul-21", formatter), 
        LocalDate.parse("2016-Dec-18", formatter)
    )
);
输出:


下面是如何继续使用纯Java 8来解析日期:

// The formatter to use when parsing the dates with a locale 
// defined to prevent failures on non english environment
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd", Locale.US);
System.out.println(
    ChronoUnit.YEARS.between(
        LocalDate.parse("1988-Jul-21", formatter), 
        LocalDate.parse("2016-Dec-18", formatter)
    )
);
输出:


使用DateFormatter适当地解析字符串。您的问题实际上是:如何从表示日期的字符串创建Joda LocalDate对象,对吗?这使得它是@fvu的一个副本,我不相信。不。你链接的问题是一个整数的字符串表示,在这个问题中,他实际上有一个3个字符的字符串。它们实际上是不同的。@Childishforlife事实上,接受的答案解释了DateTimeFormat的用法,并链接到该函数的doc页。这里解释了许多可能的模式字母及其行为,DateTimeFormat适用于许多日期和时间表示,我认为一个指向DateTimeFormat的通用答案就足够了,不需要一个涵盖该函数提供的几十种可能性的答案。这一切都很好,在文档中有非常详细的解释。@fvu-Ahhh我读了文档,我明白你的意思。很抱歉。请使用DateFormatter适当地解析字符串。您的问题实际上是:如何从表示日期的字符串创建Joda LocalDate对象,对吗?这使得它是@fvu的一个副本,我不相信。不。你链接的问题是一个整数的字符串表示,在这个问题中,他实际上有一个3个字符的字符串。它们实际上是不同的。@Childishforlife事实上,接受的答案解释了DateTimeFormat的用法,并链接到该函数的doc页。这里解释了许多可能的模式字母及其行为,DateTimeFormat适用于许多日期和时间表示,我认为一个指向DateTimeFormat的通用答案就足够了,不需要一个涵盖该函数提供的几十种可能性的答案。这一切都很好,在文档中有非常详细的解释。@fvu-Ahhh我读了文档,我明白你的意思。我道歉。