【问题标题】:How to format LocalDate to string?如何将 LocalDate 格式化为字符串?
【发布时间】:2015-03-26 11:23:15
【问题描述】:

我有一个名为 dateLocalDate 变量,当我打印它时显示 1988-05-05 我需要将其转换为 05.May 1988。如何执行此操作?

【问题讨论】:

  • 看看DateTimeFormatter 类。它甚至还有如何与Strings 相互转换的示例。
  • 你应该展示一些代码,你到目前为止已经尝试过的和没有工作的,以便人们可以帮助你。
  • 我试图这样做,但由于这个令人讨厌的“它不符合我们的质量标准”的事情我终于放弃了,我花了 15 分钟才发布这个,因为我必须纠正“i”用“我”。

标签: java jsr310


【解决方案1】:

如果他从 Java 8 中的新 LocalDate 开始,SimpleDateFormat 将不起作用。据我所知,您将不得不使用 DateTimeFormatter,http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

LocalDate localDate = LocalDate.now();//For reference
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd LLLL yyyy");
String formattedString = localDate.format(formatter);

应该打印 1988 年 5 月 5 日。要获取日期之后和月份之前的时间段,您可能必须使用 "dd'.LLLL y​​yyy"

【讨论】:

  • 非常感谢,这有帮助,但它不能与 'LLLL' 一起显示月份名称,但使用 'MMMM' 我发现这很奇怪,因为即使在文档中也有其他说明。但再次感谢您帮助我。
  • 现在 localDate.format(formatter);根本不起作用
  • 您使用@ProgrammersBlock 的JDK 版本
【解决方案2】:

可以简写为:

LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));

【讨论】:

    【解决方案3】:

    java.time

    不幸的是,所有现有答案都遗漏了一个重要的东西,Locale

    日期时间解析/格式化类型(例如现代 API 的 DateTimeFormatter 或旧 API 的 SimpleDateFormat)是 Locale 敏感的。其模式中使用的符号根据与它们一起使用的Locale 打印文本。在没有Locale 的情况下,它使用JVM 的默认Locale。查看this answer 了解更多信息。

    预期输出中的文本05.May 1988 是英文的,因此,现有解决方案将仅作为巧合的结果产生预期结果(当JVM 的默认Locale 是英文Locale 时) .

    解决方案使用java.timemodern date-time API*

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            LocalDate date = LocalDate.of(1988, 5, 5);
            final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MMMM uuuu", Locale.ENGLISH);
            String output = dtf.format(date);
            System.out.println(output);
        }
    }
    

    输出:

    05.May 1988
    

    在这里,您可以使用yyyy 代替uuuu,但可以使用I prefer uy

    Trail: Date Time 了解有关现代日期时间 API 的更多信息。


    * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

      【解决方案4】:
      System.out.println(LocalDate.now().format(DateTimeFormatter.ofPattern("dd.MMMM yyyy")));
      

      上面的答案说明了今天

      【讨论】:

      • ofPatterns 需要android O
      【解决方案5】:

      在 ProgrammersBlock 帖子的帮助下,我想出了这个。我的需求略有不同。我需要获取一个字符串并将其作为 LocalDate 对象返回。我收到了使用旧日历和 SimpleDateFormat 的代码。我想让它更流行一点。这就是我想出的。

          import java.time.LocalDate;
          import java.time.format.DateTimeFormatter;
      
      
          void ExampleFormatDate() {
      
          LocalDate formattedDate = null;  //Declare LocalDate variable to receive the formatted date.
          DateTimeFormatter dateTimeFormatter;  //Declare date formatter
          String rawDate = "2000-01-01";  //Test string that holds a date to format and parse.
      
          dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
      
          //formattedDate.parse(String string) wraps the String.format(String string, DateTimeFormatter format) method.
          //First, the rawDate string is formatted according to DateTimeFormatter.  Second, that formatted string is parsed into
          //the LocalDate formattedDate object.
          formattedDate = formattedDate.parse(String.format(rawDate, dateTimeFormatter));
      
      }
      

      希望这会对某人有所帮助,如果有人看到执行此任务的更好方法,请添加您的意见。

      【讨论】:

      • 我看到了更好的方法:LocalDate.parse(rawDate)String.format 在这里以完全错误的形式使用,实际上只是返回第一个字符串; DateTimeFormatter 根本没有被使用; parseLocalDatestatic 方法; formattedDate 不是格式化日期,甚至不是String(根据问题要求)
      【解决方案6】:

      Joda 库

      中有一个内置的方式来格式化 LocalDate
      import org.joda.time.LocalDate;
      
      LocalDate localDate = LocalDate.now();
      String dateFormat = "MM/dd/yyyy";
      localDate.toString(dateFormat);
      

      如果您还没有 - 将其添加到 build.gradle:

      implementation 'joda-time:joda-time:2.9.5'
      

      编码愉快! :)

      【讨论】:

      • 不符合 javadoc。
      • @Edward,如果不是,请证明并提供您认为更好的解决方案。
      • 你要我证明 LocalDate.toString(String pattern) 不存在吗?如果该方法确实存在,请提供该方法的参考 - 我无法在任何 javadocs 中找到它。至于解决方案,这个问题已经有了。
      • @Edward,看起来你很难找到它。更新了我的答案。
      • Joda Time 不是“内置”的。 OP 似乎在使用 java.time.LocalDate,而不是 joda.time
      【解决方案7】:

      一个很好的方法是使用SimpleDateFormat我会告诉你如何:

      SimpleDateFormat sdf = new SimpleDateFormat("d MMMM YYYY");
      Date d = new Date();
      sdf.format(d);
      

      我看到您在变量中有日期:

      sdf.format(variable_name);
      

      干杯。

      【讨论】:

      • OP 想要以特定格式打印LocalDate 实例的内容。 SimpleDateFormat怎么能在这里帮到他?
      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 2017-12-27
      • 2014-07-11
      • 2014-04-20
      • 2020-02-20
      • 1970-01-01
      相关资源
      最近更新 更多