【问题标题】:Formatting a String date into a different format in Java在 Java 中将字符串日期格式化为不同的格式
【发布时间】:2018-06-01 20:48:44
【问题描述】:

我正在尝试格式化具有date 键格式的 JSON:

日期:“2017-05-23T06:25:50”

我目前的尝试如下:

private String formatDate(String date) {
  SimpleDateFormat format = new SimpleDateFormat("MM/DD/yyyy");
  String formattedDate = "";

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

  return formattedDate;
}

但在这种情况下,我的应用程序中没有显示结果,TextView 是不可见的,我无法记录任何内容。

我确实尝试了其他解决方案,但对我来说没有成功。不知道是不是因为传入的值是一个字符串。

【问题讨论】:

  • 您是否看到任何异常?如果是这样,请在您的问题中发布堆栈跟踪。
  • 我推荐LocalDateTime.parse(date).format(DateTimeFormatter.ofPattern("MM/dd/uuuu"))。使用 ThreeTenABP 在 Android 上使用它。
  • Change date format in a Java string 的可能重复项。使用您的搜索引擎查找更多类似的问题和答案。

标签: java android string date date-format


【解决方案1】:

使用此代码格式化您的 `2017-05-23T06:25:50'

String strDate = "2017-05-23T06:25:50";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date convertedDate = new Date();
try {
    convertedDate = dateFormat.parse(strDate);
    SimpleDateFormat sdfnewformat = new SimpleDateFormat("MMM dd yyyy");
    String finalDateString = sdfnewformat.format(convertedDate);
} catch (ParseException e) {
    e.printStackTrace();
}

转换后的finalDateString 设置为您的textView

【讨论】:

【解决方案2】:

这对你有用。

String oldstring= "2017-05-23T06:25:50.0";
Date datee = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(oldstring);

【讨论】:

    【解决方案3】:

    这段代码对我有用:

     public static String getNewsDetailsDateTime(String dateTime) {
        @SuppressLint("SimpleDateFormat") DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        Date date = null;
        try {
            date = format.parse(dateTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    
        @SuppressLint("SimpleDateFormat") String strPublishDateTime = new SimpleDateFormat("MMM d, yyyy h:mm a").format(date);
        return strPublishDateTime;
    }
    

    输出格式为:2017 年 12 月 20 日下午 2.30。

    【讨论】:

      【解决方案4】:

      使用这个功能:

       private String convertDate(String dt) {
      
                  //String date="2017-05-23T06:25:50";
      
                  try {
                      SimpleDateFormat spf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); //date format in which your current string is
                      Date newDate = null;
                      newDate = spf.parse(dt);
                      spf = new SimpleDateFormat("MM/DD/yyyy"); //date format in which you want to convert
                      dt = spf.format(newDate);
                      System.out.println(dt);
      
                      Log.e("FRM_DT", dt);
      
                  } catch (ParseException e) {
                      e.printStackTrace();
                  }
                  return dt;
      
              }
      

      【讨论】:

      • 错误答案。所需字符串:2017 年 5 月 23 日。我得到了 2017 年 5 月 143 日。
      【解决方案5】:

      TL;DR

      private static final DateTimeFormatter DATE_FORMATTER 
              = DateTimeFormatter.ofPattern("MM/dd/uuuu");
      
      private static String formatDate(String date) {
          return LocalDateTime.parse(date).format(DATE_FORMATTER);
      }
      

      现在formatDate("2017-05-23T06:25:50") 返回所需的05/23/2017 字符串。

      java.time

      在 2017 年,我认为您没有理由与早已过时且臭名昭著的 SimpleDateFormat 类作斗争。 java.time,现代 Java 日期和时间 API,也称为 JSR-310,使用起来更方便。

      从一种日期时间格式转换为另一种格式时,通常需要两个格式化程序,一个用于解析输入格式,一个用于格式化为输出格式。不在这里。这是因为像 2017-05-23T06:25:50 这样的字符串采用 ISO 8601 格式,现代类将其解析为默认格式,即没有显式格式化程序。所以我们只需要一个格式化程序,用于格式化。

      你的代码出了什么问题

      当我运行你的代码时,我得到一个ParseException: Unparseable date: "2017-05-23T06:25:50"。如果您还没有注意到异常,那么您的项目设置中存在严重缺陷,它隐藏了有关错误的重要信息。请先解决问题。

      ParseException 有一个方法getErrorOffset(有点被忽略),在这种情况下返回 4。字符串中的偏移量 4 是第一个连字符所在的位置。因此,当以 MM/DD/yyyy 格式解析时,您的 SimpleDateFormat 接受了 2017 年作为一个月(很有趣,不是吗?),然后预期一个斜线并得到一个连字符,因此抛出了异常。

      您的格式模式字符串中还有另一个错误:大写 DD 表示日期(本例中为 143)。小写 dd 应用于表示日期。

      问题:我可以在 Android 上使用java.time 吗?

      是的,你可以。它只需要至少 Java 6

      • 在 Java 8 及更高版本中内置了新的 API。
      • 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(JSR 310 的 ThreeTen)。
      • 在 Android 上,使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。

      链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多