【问题标题】:SimpleDateFormat, need textual MonthSimpleDateFormat,需要文本月份
【发布时间】:2012-02-06 20:24:48
【问题描述】:

我有这个字符串02/06/2012 1:25 PM EST

我想使用 SimpleDateFormat 从该数据中返回“Feb”

这是我尝试过的

SimpleDateFormat gottenDate = new SimpleDateFormat("MMM");
            String month = "";
            try {
                month = gottenDate.format(gottenDate.parse("02/06/2012 1:25 PM EST"));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

不幸的是,gottenDate.parse("02/06/2012 1:25 PM EST") 在 SimpleDateFormat 文档说它应该可以工作时得到一个解析异常。

如果我用两个 M 而不是 3 执行 SimpleDateFormat gottenDate = new SimpleDateFormat("MM");,它会按预期为我返回“02”。文件说 3 个或更多 M 应该返回一个文本月份。这不会发生,为什么?是的,现在我可以制作一个包含月份的字符串数组,并将它们与 SDF 为我返回的数字月份相匹配,但我很好奇。

如何让它为我工作,谢谢!

【问题讨论】:

    标签: java string parsing date simpledateformat


    【解决方案1】:

    您的情况预计会出现异常:

    SimpleDateFormat gottenDate = new SimpleDateFormat("MMM");
    gottenDate.parse("02/06/2012 1:25 PM EST");
    

    "gottenDate" 设置为解析字符串,如果它匹配 "MMM" 模式。以下应该有效:

    SimpleDateFormat gottenDate = new SimpleDateFormat("MMM");
    gottenDate.parse("Feb");
    

    希望你能看到这里发生了什么。

    【讨论】:

    • 我现在明白了。不幸的是,我得到的日期实际上是传递给该方法的,它的格式是 "02/06/2012 1:25 PM EST" ,我想我只会制作一个相应的月份数组来告诉它 02 的含义
    • 不一定。您可以将其分为两步:1) parse 字符串使用一个具有已知模式的 SimpleDateFormat 实例; 2) 一旦你得到一个 Date 对象 - format 它使用另一个 SimpleDateFormat 实例,比如 new SimpleDateFormat("MMM").
    【解决方案2】:

    您需要一种格式来解析日期:MM/dd/yyyy,一旦您从第一种日期格式中获得了一个 Date 对象,您需要第二个格式:MMM,以便根据需要格式化日期。

    使用MM 格式化将为您提供两位数的月份,使用MMM 进行解析将需要一个缩写的文本月份,并且不会解析02

    【讨论】:

      【解决方案3】:

      您需要两个具有相应格式字符串的独立 SimpeDateFormat 实例来解析源日期并将其格式化回短月份形式。您的格式实例无法解析完整日期,因为它只需要指定字符串中的月份。

      SimpleDateFormat monthDate = new SimpleDateFormat("MMM");
      SimpleDateFormat gottenDate = new SimpleDateFormat("dd/MM/yyyy h:mm a z");
      String month = "";
      try {
          month = monthDate .format(gottenDate.parse("02/06/2012 1:25 PM EST"));
      } catch (ParseException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      

      不确定源字符串的格式,复杂的格式字符串有点棘手。

      【讨论】:

        【解决方案4】:

        这是获取 MonthName 给您的代码:

        public String getMonthName(String dtstr, String fmt) throws ParseException {
           SimpleDateFormat gottenDate = new SimpleDateFormat(fmt);
           SimpleDateFormat month = new SimpleDateFormat("MMM");
           Date dt = gottenDate.parse(dtstr);
           return month.format(dt);
        }
        

        这样称呼它:

        System.out.println(getMonthName("01/06/2012 1:25 PM EST"), "M/d/y");
        

        输出:

        Feb
        

        【讨论】:

          【解决方案5】:

          嗯,其他人回答得更快,但我认为这会满足你的要求。

          String date_str = "02/06/2012 1:25 PM EST";
          SimpleDateFormat in_format = new SimpleDateFormat("MM/dd/yyyy h:mm aa zzz");
          SimpleDateFormat out_format = new SimpleDateFormat("MMM");
          Date my_date = in_format.parse(date_str);
          String out_str = out_format.format(my_date);
          System.out.println(out_str); // Prints Feb
          

          日期和时间可能会因为人们在不同记录时间的方式而变得复杂。我找到的理解所有这些的最佳参考在这里: http://www.odi.ch/prog/design/datetime.php

          【讨论】:

            【解决方案6】:

            只是为了提供一种替代解决方案,因为您的工作是“提取”日期的月份,我认为 Calendar 最适合该工作。

            // Construct a Date object
            final DateFormat df = new SimpleDateFormat("M/d/y");
            final Date originalDate = df.parse("02/06/2012 1:25 PM EST");
            
            final Calendar c = Calendar.getInstance();
            c.setTime(originalDate); // set the calendar Date
            // Extract the month
            String month = c.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.US);
            System.out.println(month); 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-09
              • 1970-01-01
              • 1970-01-01
              • 2021-11-25
              • 1970-01-01
              相关资源
              最近更新 更多