【问题标题】:Change date string format in android在android中更改日期字符串格式
【发布时间】:2012-05-03 06:51:41
【问题描述】:

我从 SAX 解析中获取日期字符串,如下所示:Wed, 18 Apr 2012 07:55:29 +0000

现在,我希望此字符串为:Apr 18, 2012 01:25 PM

我该怎么做?

【问题讨论】:

    标签: android


    【解决方案1】:
    SimpleDateFormat format = new SimpleDateFormat("MMM dd,yyyy  hh:mm a");
    String date = format.format(Date.parse("Your date string"));
    

    更新:-

    如上,Date.parse("Your date string"); 已弃用。

    String strCurrentDate = "Wed, 18 Apr 2012 07:55:29 +0000";
    SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss Z");
    Date newDate = format.parse(strCurrentDate);
    
    format = new SimpleDateFormat("MMM dd,yyyy hh:mm a");
    String date = format.format(newDate);
    

    【讨论】:

    • Date.parse() 已弃用 :(
    • @offset 现在看起来没问题。
    【解决方案2】:

    这样就可以了:

    public static String formateDateFromstring(String inputFormat, String outputFormat, String inputDate){
    
        Date parsed = null;
        String outputDate = "";
    
        SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, java.util.Locale.getDefault());
        SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, java.util.Locale.getDefault());
    
        try {
            parsed = df_input.parse(inputDate);
            outputDate = df_output.format(parsed);
    
        } catch (ParseException e) { 
            LOGE(TAG, "ParseException - dateFormat");
        }
    
        return outputDate;
    
    }
    

    例子:

    String date_before = "1970-01-01";
    String date_after = formateDateFromstring("yyyy-MM-dd", "dd, MMM yyyy", date_before);
    

    输出:

    date_after = "01, Jan 1970";
    

    【讨论】:

    • 这么有用的实用功能
    【解决方案3】:

    这对我有用,使用 SimpleDateFormatCalendar

    String originDate = "Wed, 18 Apr 2012 07:55:29 +0000";
    SimpleDateFormat formatIn = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss Z");
    SimpleDateFormat formatOut = new SimpleDateFormat("MMM dd,yyyy hh:mm a");
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(formatIn.parse(originDate));
    
    String newDate = formatOut.format(calendar.getTime());
    

    【讨论】:

      【解决方案4】:

      java.time 和 ThreeTenABP

      这个问题的现代答案已经过期了。当这个问题在 2012 年被问到时,使用 SimpleDateFormat 和/或 DateFormat 作为其他答案是正确的,即使这些课程一直很麻烦。几年后,它们被现代 Java 日期和时间 API 的 java.time 所取代,坦率地说,我发现使用它要好得多。所以我正在这样做。

      我建议您将转换分为两个操作。在您的程序中,不要将日期和时间保留为字符串。将它们保留为适当的日期时间对象。因此,当从 SAX 解析时,也会立即将日期时间字符串解析为 OffsetDateTime。当您稍后需要向用户显示日期和时间(或将其传输到另一个系统)时,将其转换为用户的时区并将其格式化为相应的字符串。

      解析为 OffsetDateTime

      你得到的字符串符合 RFC 1123 格式。 java.time 有一个内置的格式化程序,这很好,因为它使我们免于构建自己的格式化程序。

          String stringFromSaxParsing = "Wed, 18 Apr 2012 07:55:29 +0000";
      
          OffsetDateTime dateTime = OffsetDateTime.parse(
                  stringFromSaxParsing, DateTimeFormatter.RFC_1123_DATE_TIME);
      
          System.out.println(dateTime);
      

      这个 sn-p 的输出是:

      2012-04-18T07:55:29Z

      转换为用户的时区和格式

          DateTimeFormatter wantedFormatter = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm a", Locale.ENGLISH);
      
          String formatted = dateTime.atZoneSameInstant(ZoneId.systemDefault())
                  .format(wantedFormatter);
      
          System.out.println(formatted);
      

      我在亚洲/科伦坡时区运行了这个并得到了想要的结果:

      2012 年 4 月 18 日下午 1:25

      问题:java.time 不需要 Android API 26 级吗?

      java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

      • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
      • 在非 Android Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
      • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

      链接

      【讨论】:

        【解决方案5】:

        根据官方文档,在新的 API (18+) 中你应该实现这个:

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US);
        String time=sdf.format(new Date());
        

        文档: http://developer.android.com/reference/java/text/SimpleDateFormat.html

        【讨论】:

          【解决方案6】:

          最简单的解决方案是使用DateFormat 的getter 方法: getDateTimeInstance DateFormat 对象格式日期如下:1969 年 12 月 31 日下午 4:00:00,但是在 4:00 之后还有那些额外的零

          Date date = new Date();
          String fDate = DateFormat.getDateTimeInstance().format(date);
          System.out.println(fDate);
          

          【讨论】:

            【解决方案7】:

            这是我的解决方案,可能对您有所帮助

             public static void setFormattedEventDate(TextView textView,String start_date , String end_date){
                    SimpleDateFormat formatIn = new SimpleDateFormat("yyyy-MM-dd");
                    SimpleDateFormat formatOut = new SimpleDateFormat("dd MMM");
                    try {
                        Date startDate = formatIn.parse(start_date);
                        Date endDate = formatIn.parse(end_date);
                        String outputStartDate = formatOut.format(startDate);
                        String outputEndDate = formatOut.format(endDate);
                        textView.setText(outputStartDate+" - "+outputEndDate);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
            
                }
            

            然后像这样调用这个方法

            setFormattedEventDate(contentViewHolder.rowItemEventBinding.txtCompetitionDate, event.datestart, event.dateend);
            

            【讨论】:

              【解决方案8】:

              试试这个:

                String dt =""; // your time value in there
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
              
                                  Calendar c = Calendar.getInstance();
                                  try {
                                      c.setTime(sdf.parse(dt));
                                  } catch (ParseException e) {
                                      e.printStackTrace();
                                  }
                                  SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy");//any format you want
                                  String output = sdf1.format(c.getTime());
              

              【讨论】:

                猜你喜欢
                • 2016-06-25
                • 1970-01-01
                • 2016-02-21
                • 2011-05-04
                • 2023-03-18
                • 2022-07-04
                • 2022-09-23
                • 2021-12-16
                相关资源
                最近更新 更多