Java中转换日期格式的问题

发布于 2024-10-23 00:36:51 字数 1439 浏览 5 评论 0原文

我有一个 MMM/dd/yyyy 形式的字符串,即。 2010 年 5 月 21 日。 现在我想将其转换为 yyyyMMdd,即。 20100521。

我的代码是:

public static void main(String[] args) {        
        ArrayList<String> dates = new ArrayList<String>();
        dates.add("Jan/13/2011");
        dates.add("Feb/03/2001");
        dates.add("Mar/19/2012");
        dates.add("Apr/20/2011");
        dates.add("May/21/2010");
        dates.add("Jun/23/2008");
        dates.add("Jul/12/2009");
        dates.add("Aug/14/2010");
        dates.add("Sep/01/2011");
        dates.add("Oct/07/2010");
        dates.add("Nov/05/2011");
        dates.add("Dec/30/2011");

        for(String s : dates) {
            System.out.println(transformPrevDate(s));
        }
    }

转换方法:

public String transformPrevDate(String datoe) {
        String[] splitter = datoe.split("/");
        String m = splitter[0].toUpperCase();
        String d = splitter[1];
        String y = splitter[2];

        DateFormat formatter = new SimpleDateFormat("MMM");
        DateFormat formatter2 = new SimpleDateFormat("MM");

        try {
            Date date = formatter.parse(m);
            m = formatter2.format(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        String date = y + m + d;

        return date;
    }

问题是我在五月和十月收到不可解析的日期异常。我来自丹麦,如果我将其更改为丹麦语“Maj”和“Okt”,它就会成功。那么我在这里做错了什么?

I have a string in the form MMM/dd/yyyy, ie. May/21/2010.
Now I want to convert it to yyyyMMdd, ie. 20100521.

My code is:

public static void main(String[] args) {        
        ArrayList<String> dates = new ArrayList<String>();
        dates.add("Jan/13/2011");
        dates.add("Feb/03/2001");
        dates.add("Mar/19/2012");
        dates.add("Apr/20/2011");
        dates.add("May/21/2010");
        dates.add("Jun/23/2008");
        dates.add("Jul/12/2009");
        dates.add("Aug/14/2010");
        dates.add("Sep/01/2011");
        dates.add("Oct/07/2010");
        dates.add("Nov/05/2011");
        dates.add("Dec/30/2011");

        for(String s : dates) {
            System.out.println(transformPrevDate(s));
        }
    }

And the method to transform:

public String transformPrevDate(String datoe) {
        String[] splitter = datoe.split("/");
        String m = splitter[0].toUpperCase();
        String d = splitter[1];
        String y = splitter[2];

        DateFormat formatter = new SimpleDateFormat("MMM");
        DateFormat formatter2 = new SimpleDateFormat("MM");

        try {
            Date date = formatter.parse(m);
            m = formatter2.format(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        String date = y + m + d;

        return date;
    }

The problem is that I get an Unparseable date exception, on May and Oct. I'm from Denmark and if I change it to danish "Maj" and "Okt" it succeeds. So what am I doing wrong here?

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

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

发布评论

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

评论(6

玻璃人 2024-10-30 00:36:51

您的 transformDate 方法可以更简单地编写,如下所示:

DateFormat input = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH);
DateFormat output = new SimpleDateFormat("yyyyMMdd");
public String transformPrevDate(String datoe) throws ParseException {
    return output.format(input.parse(datoe));
}

您不需要自己进行解析。

Your transformDate method can be much simpler written like this:

DateFormat input = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH);
DateFormat output = new SimpleDateFormat("yyyyMMdd");
public String transformPrevDate(String datoe) throws ParseException {
    return output.format(input.parse(datoe));
}

You don't need to do your parsing yourself.

凡尘雨 2024-10-30 00:36:51

使用 SimpleDateFormat(String pattern, Locale locale)Locale 添加到日期解析中(对于英语,请使用 Locale.ENGLISH< /代码>)。

更好的解决方案:

public String transformPrevDate(String datoe) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH);
    SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyyMMdd");

    try {
        return dateFormat2.format(dateFormat.parse(datoe));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Use SimpleDateFormat(String pattern, Locale locale) to add Locale to your date parsing (for english, use Locale.ENGLISH).

Better solution:

public String transformPrevDate(String datoe) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH);
    SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyyMMdd");

    try {
        return dateFormat2.format(dateFormat.parse(datoe));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
青巷忧颜 2024-10-30 00:36:51

您需要应用 SimpleDateFormat 上的区域设置

这是一个更短的版本:-

public String transformPrevDate(String date) {
    DateFormat oldFormat = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH);
    DateFormat newFormat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH);

    String formattedDate = "";

    try {
        formattedDate = newFormat.format(oldFormat.parse(date));
    }
    catch (ParseException e) {
        e.printStackTrace();
    }

    return formattedDate;
}

@Test
public void testTransformPrevDate() {
    assertEquals("20110113", transformPrevDate("Jan/13/2011"));
    assertEquals("20010203", transformPrevDate("Feb/03/2001"));
}

You will need to apply the locale on SimpleDateFormat.

Here's a more shorter version:-

public String transformPrevDate(String date) {
    DateFormat oldFormat = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH);
    DateFormat newFormat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH);

    String formattedDate = "";

    try {
        formattedDate = newFormat.format(oldFormat.parse(date));
    }
    catch (ParseException e) {
        e.printStackTrace();
    }

    return formattedDate;
}

@Test
public void testTransformPrevDate() {
    assertEquals("20110113", transformPrevDate("Jan/13/2011"));
    assertEquals("20010203", transformPrevDate("Feb/03/2001"));
}
一笔一画续写前缘 2024-10-30 00:36:51

使用SimpleDateFormat(字符串模式,区域设置语言环境);

use SimpleDateFormat(String pattern, Locale locale);

蓝眸 2024-10-30 00:36:51

SimpleDateFormat 与区域设置相关,默认情况下它使用您自己的区域设置。如果您想使用基于英语的语言环境,可以通过 在创建 SimpleDateFormat 时传入 Locale

因此,要使用基于美国的区域设置,请将 SimpleDateFormat 初始化更改为:

    DateFormat formatter = new SimpleDateFormat("MMM", Locale.US);
    DateFormat formatter2 = new SimpleDateFormat("MM", Locale.US);

SimpleDateFormat is locale-dependent, and it's using your own locale by default. If you would like to use an English-based locale, you can create it by passing in a Locale when you create your SimpleDateFormat.

So to use a US-based locale, change your SimpleDateFormat initialization to:

    DateFormat formatter = new SimpleDateFormat("MMM", Locale.US);
    DateFormat formatter2 = new SimpleDateFormat("MM", Locale.US);
玻璃人 2024-10-30 00:36:51

SimpleDateFormat 使用您的区域设置 - 因此您的计算机可能默认设置为使用丹麦语。明确指定英语区域设置:

DateFormat formatter = new SimpleDateFormat("MMM", Locale.ENGLISH);

SimpleDateFormat uses your locale - so your computer is probably set to use Danish by default. Specify the English Locale explicitly:

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