如何在Java中从日期获取世纪

10

如何从Java中的日期获取当前世纪?

例如,针对格式为"MM/dd/yyyy"的日期"06/03/2011",如何使用SimpleDateFormat获取当前世纪?


1
在这种情况下,您想要什么作为世纪,“19”? - Andrzej Doyle
我想获取当前世纪。 - Zeeshan
1
2011年属于21世纪。您需要确切的这个值吗? - BalusC
1
是的,我想要精确地得到值“21”。 - Zeeshan
预计这部分内容会在一定程度上受到文化影响。丹麦语言委员会曾经决定,新的“世纪”从2000年1月1日开始(而不是2001年)。我不同意这个观点,但我确实预计,在某些地方,用户更喜欢谈论“20世纪”而不是“1900年代”(也许没有一个好的英文术语存在)。 - Ole V.V.
7个回答

15

对Harry Lime所发帖子做了一点修改,他的逻辑并不完全正确。1901年是20世纪,但1900年属于19世纪。

public class CenturyYear {

    public static void main(String[] args) {
        int test = centuryFromYear(1900);
        System.out.println(test);

    }

    static int centuryFromYear(int year) {
        if (year % 100 == 0) {
            year = year / 100;
        } else {
            year = (year / 100) + 1;
        }
        return year;
    }

}

14
Date date = new SimpleDateFormat("MM/dd/yyyy").parse(yourString);

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

int century = (calendar.get(Calendar.YEAR) / 100) +1;

1
如果你认为公元1年到100年是第一个世纪,那么你需要使用(calendar.get(Calendar.YEAR) + 99 / 100)这个公式,但如果你认为20世纪是从1900年到1999年,那么这个公式就是正确的。 - Peter Lawrey
1
是的,那确实是我们需要做的:愚蠢的 +1... 我讨厌它。为什么只有程序员知道从零开始计数更有趣呢?0-99年应该是第0世纪。2000-2099年应该是第20世纪。难道还有比这更合乎逻辑的吗? - Martijn Courteaux

6

其他回答是正确的,但已过时。

java.time

java.time框架已内置于Java 8及以后版本中。这些类取代了旧的麻烦日期时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

现在处于维护模式Joda-Time项目也建议迁移到java.time。

要了解更多信息,请参见Oracle教程。并搜索Stack Overflow以获取许多示例和说明。

大部分java.time功能已经通过ThreeTen-Backport向Java 6和7的后备端口转移,并进一步适应了ThreeTenABP中的Android。

ThreeTen-Extra项目扩展了java.time的附加类。该项目是java.time可能未来添加的试验场。

LocalDate

LocalDate类表示仅包含日期值而不包含时间和时区的值。

要解析,请指定格式化模式。顺便说一句,我建议使用ISO 8601标准格式,这些格式可以直接由java.time类解析。

String input = "06/03/2011";

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MM/dd/uuuu" ).withLocale ( Locale.US );
LocalDate ld = LocalDate.parse ( input , f );

要得到世纪,只需将年份除以100。如果您想要序数词,例如20xx的“二十一世纪”,则再加上1。

int centuryPart = ( ld.getYear () / 100 );
int centuryOrdinal = ( ( ld.getYear () / 100 ) + 1 );

转储到控制台。

System.out.println ( "input: " + input + " | ld: " + ld + " | centuryPart: " + centuryPart + " | centuryOrdinal: " + centuryOrdinal );

输入: 06/03/2011 | ld: 2011-06-03 | centuryPart: 20 | centuryOrdinal: 21


3
int century =  (year + 99)/ 100;

0

我不懂Java,但为什么你不获取完整的年份并将最后两位数变为0呢?

编辑

如果你想让2011年成为21世纪 - 只需获取完全限定的年份(以字符串格式),然后去掉最后2个字符,再进行解析成int型并加1即可!


很可能是因为那不符合他的要求。 - Anthony Grist
1
是的,但他没有说出他的要求是什么,而按照我的建议去做会给他带来世纪之苦... - jcvandan
如果我们采用传统的世纪定义,你的公式将会在每个世纪的最后一年给出错误的结果。例如,它会认为2000年属于21世纪。 - Olaf

0

你只需要返回 (year + 99) / 100


1
感谢您想贡献。这正是 Chinthaka Devinda 的答案 所说的。我不认为在此重复它有任何用处。 - Ole V.V.
之前已经被注释过了。 - Lucas Goldner

-2

按斜杠分割,获取结果数组中第三个元素的前两个字符,使用Integer.parseInt进行转换并加1,即:

String arr = myDate.split("/");
String shortYear = myDate[2].substring(0, 2);
int century = Integer.parseInt(shortYear) + 1;
(我头脑中对substring()语法不确定)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接