【问题标题】:Convert String to LocalDate将字符串转换为 LocalDate
【发布时间】:2019-01-28 14:28:30
【问题描述】:

我想将21022019 转换为2019-02-21,但由于某种原因我无法转换。

import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;

public class StringToLocalDate {
    public static void main(String[] args) {
        System.out.println(convert("21022019"));
    }

    static LocalDate convert(String date) {
        LocalDateTime ldt;
        ldt = LocalDateTime.parse(date, DateTimeFormat.forPattern("YYYY-MM-dd"));
        return LocalDateTime.now().toLocalDate();
    }
} 

【问题讨论】:

  • 你需要告诉它如何解析
  • 你真的不想要一个String回来,并且只使用LocalDate在两种格式之间进行转换吗?
  • 将字符串转换为LocalDate
  • 出了什么问题?你会得到什么结果?如果您收到任何错误消息,请逐字引用,它会告诉我们很多信息。 “寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用”(引自What topics can I ask about here?
  • Convert String Date to String date different format 的可能重复项(我知道这个问题是关于老式的SimpleDateFormat,但问题/错误非常相似)

标签: java datetime jodatime joda-convert


【解决方案1】:

如果您使用的是 Java 8,则可以使用由创建 Joda time 的同一个人 (Stephen Colebourne) 开发的本机 Java Time 库。以各种格式解析和显示日期非常容易。

您的主要问题似乎是您将预期对象视为LocalDateTime,但没有时间存在。这实际上是通过运行时错误抛出您的代码,该错误指出您需要包含时间,因此您应该改用LocalDate

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class StringToLocalDate {
    public static String DATE_FORMAT_INPUT = "ddMMyyyy";
    public static String DATE_FORMAT_OUTPUT = "yyyy-MM-dd";

    public static void main(String[] args) {
        System.out.println(formatted(convert("21022019")));
    }

    public static String formatted(LocalDate date) {
        return date.format(DateTimeFormatter.ofPattern(DATE_FORMAT_OUTPUT));
    }

    public static LocalDate convert(String dateStr) {
        return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(DATE_FORMAT_INPUT));
    }
}

如果需要使用1.8之前的Java版本,可以使用以下。非常相似。

import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;

public class StringToLocalDate {
    public static String DATE_FORMAT_INPUT = "ddMMyyyy";
    public static String DATE_FORMAT_OUTPUT = "yyyy-MM-dd";

    public static void main(String[] args) {
        System.out.println(formatted(convert("21022019")));
    }

    public static String formatted(LocalDate date) {
        return date.toString(DateTimeFormat.forPattern(DATE_FORMAT_OUTPUT));
    }

    public static LocalDate convert(String dateStr) {
        return LocalDate.parse(dateStr, DateTimeFormat.forPattern(DATE_FORMAT_INPUT));
    }
}

【讨论】:

    【解决方案2】:

    您应该使用另一种模式来解析输入日期

       public static void main(String[] args) {
    
            System.out.println(convert("21022019"));
        }
    
        static LocalDate convert(String date) {
            return LocalDate.parse(date, DateTimeFormat.forPattern("ddMMyyyy"));
        }
    

    【讨论】:

      【解决方案3】:

      好像21022019是2019年2月21号,试试:

      return LocalDate.parse(date, DateTimeFormat.forPattern("ddMMyyyy"))
      

      【讨论】:

      • 2019-01-28 但我希望在没有今天日期的情况下解析相同的日期。
      • 是的,@UdayKiran,这个答案中的代码正是这样做的,解析时没有今天的日期。
      【解决方案4】:

      你可以像下面这样使用 SimpleDateFormat:

      import java.text.*;
      
      ...//your class
      
      String pattern = "yyyy-MM-dd";
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
      
      String date = simpleDateFormat.format(new Date());
      System.out.println(date);
      

      参考:http://tutorials.jenkov.com/java-internationalization/simpledateformat.html

      【讨论】:

      • 感谢您的教程。
      • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。尤其是当提问者已经在使用更现代和更优越的 Joda-Time 时。
      【解决方案5】:

      100% 工作代码

         LocalDate localDate = LocalDate.parse("Wed, 21 Jan 2021 10:24 AM", DateTimeFormatter.ofPattern("EE, d MMM yyyy hh:mm a"));
      

      【讨论】:

      • 工作,但不是 100%。仅适用于英语地区。
      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2011-02-12
      • 2016-02-23
      • 2019-07-16
      • 2011-04-12
      • 2017-11-02
      • 2016-10-29
      • 2020-02-20
      相关资源
      最近更新 更多