是否可以创建一个 DateFormatter 将两位数年份转换为四位数年份?

发布于 2024-10-19 11:13:37 字数 411 浏览 1 评论 0原文

在我的 Java 应用程序中,我使用 DateFormat 实例来解析日期输入。

DateFormat fmt;
fmt = DateFormat.getDateInstance(DateFormat.DEFAULT)  // dd.MM.yyyy for de_DE

问题在于用户坚持以 31.12.11 的形式输入日期。

不幸的是,它被解析为 31.12.11。 (ISO 格式中的 0011-12-31) 相反,我希望解析的日期变为 31.12.2011 (ISO 格式中的 2011-12-31格式)。

我可以修改日期格式以某种方式解析输入吗?

In my Java application I use a DateFormat instance to parse date inputs.

DateFormat fmt;
fmt = DateFormat.getDateInstance(DateFormat.DEFAULT)  // dd.MM.yyyy for de_DE

The problem is that the user insists to enter dates in the form 31.12.11.

Unfortunately this is parsed to 31.12.11. (0011-12-31 in ISO format) Instead I want the parsed date to become 31.12.2011 (2011-12-31 in ISO format).

Can I modify the date format to somehow parse inputs that way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

最单纯的乌龟 2024-10-26 11:13:37

您必须使用 dd.MM.yy 格式进行解析,并使用 yyyy-MM-dd 格式重新格式化

DateFormat sdfp = new SimpleDateFormat("dd.mm.yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy-MM-dd");
String date = sdff.format(d);

。有关设置模式的更多信息,请参阅 Java API。

http://download.oracle.com/javase/6 /docs/api/java/text/SimpleDateFormat.html

You will have to parse with a format of dd.MM.yy and re-format with a format of yyyy-MM-dd

DateFormat sdfp = new SimpleDateFormat("dd.mm.yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy-MM-dd");
String date = sdff.format(d);

See the Java API for more info on setting patterns.

http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

月亮是我掰弯的 2024-10-26 11:13:37

这里的解决方案非常简单,可以使用 SimpleDateFormat,其中包括方法 set2DigitYearStart(Date startDate)。也许它看起来像这样。

String userInput = "31.12.11";
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy");
format.set2DigitYearStart(new GregorianCalendar(2001,1,1).getTime());
Date userEnteredDate = format.parse(userInput, 1); // parsed to 2011-12-31

Your solution here is sufficiently simple as to allow for the use of SimpleDateFormat, which includes the method set2DigitYearStart(Date startDate). Perhaps it looks something like this.

String userInput = "31.12.11";
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy");
format.set2DigitYearStart(new GregorianCalendar(2001,1,1).getTime());
Date userEnteredDate = format.parse(userInput, 1); // parsed to 2011-12-31
芸娘子的小脾气 2024-10-26 11:13:37

是的,您可以使用 DateFormat.SHORT 而不是 DEFAULT 进行解析。

或者,尝试使用 SHORT 进行解析,然后尝试其他格式(如果不起作用)。

Yes, you could parse using DateFormat.SHORT instead of DEFAULT.

Or possibly, try to parse with SHORT, and then try other formats if that doesn't work.

秉烛思 2024-10-26 11:13:37

您可以使用 SimpleDateFormat 解析此日期,但如何确定该日期是 1911 年还是 2011 年还是其他日期。您应该使用年份格式 yyyy。

You can parse this date using SimpleDateFormat but how you will determine that was 1911 or 2011 or anything else. you should use year format as yyyy.

多孤肩上扛 2024-10-26 11:13:37

如果您使用 GWT,则无法访问 SimpleDateFormat,因此这里有一些手动执行此操作的代码:

String[] parts = dateText.split(" ");

// Convert 2 digit date to 4 digits
if (parts.length == 3 && parts[2].length() == 2) {
    int year = Integer.valueOf(parts[2]);

    // Allow 5 years in the future for a 2 digit date
    if (year + 100 > new Date().getYear()+5) {
        year = year + 1900;
    }
    else {
        year = year + 2000;
    }
    dateText = parts[0] + " " + parts[1] + " " + String.valueOf(year);
}

假设您已验证 dateText 是用空格分隔的。

If you use GWT, you don't have access to SimpleDateFormat, so here is some code to do it manually:

String[] parts = dateText.split(" ");

// Convert 2 digit date to 4 digits
if (parts.length == 3 && parts[2].length() == 2) {
    int year = Integer.valueOf(parts[2]);

    // Allow 5 years in the future for a 2 digit date
    if (year + 100 > new Date().getYear()+5) {
        year = year + 1900;
    }
    else {
        year = year + 2000;
    }
    dateText = parts[0] + " " + parts[1] + " " + String.valueOf(year);
}

This assumes you have validated that the dateText is separated with spaces.

聆听风音 2024-10-26 11:13:37

近似值:

int twoDigitYear = 11;
int fourDigitYear = 0;
DateTime now = new DateTime();

if (twoDgYear + 2000 > now().getYear()) {
   fourDigitYear = twoDigitYear + 1900;
}else{
   fourDigitYear = twoDigitYear + 2000;
}

可能适合也可能不适合您的需要......

An approximation:

int twoDigitYear = 11;
int fourDigitYear = 0;
DateTime now = new DateTime();

if (twoDgYear + 2000 > now().getYear()) {
   fourDigitYear = twoDigitYear + 1900;
}else{
   fourDigitYear = twoDigitYear + 2000;
}

May or may not fit your need...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文