【问题标题】:Problem converting date format in Java在 Java 中转换日期格式的问题
【发布时间】:2011-03-16 14:30:52
【问题描述】:

我有一个 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;
    }

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

【问题讨论】:

    标签: java date simpledateformat


    【解决方案1】:

    您的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));
    }
    

    您不需要自己进行解析。

    【讨论】:

    • 仅供参考...您仍然需要将其包装在 try-catch 块中或使用 API 来抛出 ParseException,因为 input.parse(datoe) 抛出 ParseException,这是一个检查异常。
    【解决方案2】:

    使用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();
        }
    }
    

    【讨论】:

      【解决方案3】:

      您需要申请the locale on 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"));
      }
      

      【讨论】:

        【解决方案4】:

        使用SimpleDateFormat(String pattern, Locale locale)

        【讨论】:

          【解决方案5】:

          SimpleDateFormat 依赖于语言环境,默认情况下它使用您自己的语言环境。如果您想使用基于英语的语言环境,您可以通过passing in a Locale when you create your SimpleDateFormat 创建它。

          所以要使用基于美国的语言环境,请将您的 SimpleDateFormat 初始化更改为:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 2011-02-05
              • 2012-04-16
              • 2011-11-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多