【问题标题】:Convert string to DateFormat将字符串转换为日期格式
【发布时间】:2014-01-18 05:33:19
【问题描述】:

我正在尝试将字符串 utc 日期转换为日期。通过使用以下代码

这是我的 UTC 字符串日期 - 12/31/2013 8:40:00 AM

我想将此字符串转换为 UTC 日期。

static final String DATEFORMAT = "dd/MM/yyyy HH:mm:ss aa";

StringDateToDate("**12/31/2013 8:40:00 AM**");

 public static Date StringDateToDate(String StrDate)
    {
        Date dateToReturn = null;
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

            try {
                dateToReturn = dateFormat.parse(StrDate);
            } catch (ParseException e) {

                e.printStackTrace();
            }


        return dateToReturn;

}

但我得到了错误格式的错误日期(sun jul 12 19:40:00 CDT 2015)。如何将此 utc 日期字符串转换为 utc 日期。我正在从 XML 格式的 REST Web 服务获取 utcdatestring。

【问题讨论】:

  • 没有 31 个月 :)

标签: java android string date datetime


【解决方案1】:

得到的结果没有错,但正是预期的结果。

默认情况下,解析是宽松的。通过宽松的解析,解析器可能会使用启发式方法来解释不精确匹配此对象格式的输入。

启发式使用为月份指定的数字不是指定年份中的月份,而是指定年份以来的月份,31 个月是 2 年 7 个月,因此:01/2013 + 2years + 7 个月 = 07/2015。

这可能会造成混淆,因此建议在解析之前将宽松解析设置为 false,但是当模式与字符串中的某些内容不匹配时,会引发解析异常。

public static Date StringDateToDate(String StrDate) {
    Date dateToReturn = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

    dateFormat.setLenient(false);

    try {
        dateToReturn = dateFormat.parse(StrDate);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return dateToReturn;
}

【讨论】:

    【解决方案2】:

    还要注意 HH。 HH 是一天中的小时 (0-23)。如果您输入的日期时间是 0-11(可能是这样,因为给出了 AM\PM 并且模式末尾有 aa),那么必须使用 KK 而不是 HH。

    【讨论】:

      【解决方案3】:

      像这样改变你的日期格式。

          String DATEFORMAT = "MM/dd/yyyy HH:mm:ss aa";
      

      【讨论】:

      • @madanV 尝试 dateFormat.setTimeZone(TimeZone.getDefault());而不是 TimeZone.getTimeZone("UTC")
      【解决方案4】:

      您的输入错误(没有 31 个月),请将其更改为有效月份

      StringDateToDate("12/01/2013 8:40:00 AM"); 
      

      日期格式

      兼容

      或更改您的日期格式以适合您的输入值

      static final String DATEFORMAT = "MM/dd/yyyy HH:mm:ss aa";
      

      【讨论】:

        【解决方案5】:

        首先你的日期格式错误应该是:

        static final String DATEFORMAT = "MM/dd/yyyy HH:mm:ss aa";
        

        其次,您的输入不能有这样的星号(*):

        Date a = StringDateToDate("12/31/2013 8:40:00 AM");
        //yea I know I should be using Log but I'm testing on java
        System.out.println(a.toString()); 
        

        如果你真的想要星号,请这样做:

        String b = "**12/31/2013 8:40:00 AM**";
        StringDateToDate(b.substring(2, b.length()-2));
        

        【讨论】:

          【解决方案6】:

          试试这个。可能您的日期格式的顺序是错误的

          String dtStart = "12/31/2013 8:40:00 AM";  
          SimpleDateFormat  format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aa");  
          
          Date date = format.parse(dtStart);  
          System.out.println(date);  
          

          【讨论】:

            【解决方案7】:

            您的日期格式应该是这样,以便解析您在此处给出的字符串。

            static final String DATEFORMAT = "MM/dd/yyyy HH:mm:ss aa";
            

            【讨论】:

              【解决方案8】:
              G   Era designator       Text               AD
              y   Year                 Year               1996; 96
              M   Month in year        Month              July; Jul; 07
              w   Week in year         Number             27
              W   Week in month        Number             2
              D   Day in year          Number             189
              d   Day in month         Number             10
              F   Day of week in month Number             2
              E   Day in week          Text               Tuesday; Tue
              u   Day number of week   Number             1
              a   Am/pm marker         Text               PM
              H   Hour in day (0-23)   Number             0
              k   Hour in day (1-24)   Number             24
              K   Hour in am/pm (0-11) Number             0
              h   Hour in am/pm (1-12) Number             12
              m   Minute in hour       Number             30
              s   Second in minute     Number             55
              S   Millisecond          Number             978
              z   Time zone            General time zone  Pacific Standard Time; PST; GMT-08:00
              Z   Time zone            RFC 822 time zone  -0800
              X   Time zone            ISO 8601 time zone -08; -0800; -08:00
              

              这是Date and Time Patterns

              String string = "January 2, 2010";
              Date date = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(string);
              System.out.println(date);
              

              【讨论】:

                猜你喜欢
                • 2013-12-28
                • 1970-01-01
                • 2019-10-13
                • 1970-01-01
                相关资源
                最近更新 更多