【问题标题】:Catering for multiple date formats when converting date formats using Joda time使用 Joda 时间转换日期格式时满足多种日期格式
【发布时间】:2014-11-25 16:13:00
【问题描述】:

以下代码将日期格式从 "yyyy-MM-dd'T'HH:mm:ss" 转换为 "MM/dd/yyyy"

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class TestDate {

    public static void main(String[] args) {

        DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");
        DateTime dateTime = parser.parseDateTime("2014-05-19T23:59:59");
        DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/dd/yyyy");
        System.out.println(formatter.print(dateTime)+"\n");

        dateTime = parser.parseDateTime("2014-06-09T03:00:23.67");
        formatter = DateTimeFormat.forPattern("MM/dd/yyyy");
        System.out.println(formatter.print(dateTime));

    }

"2014-06-09T03:00:23.67" 抛出异常:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "2014-06-09T03:00:23.67" is malformed at ".67"
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:899)
    at TestDate.main(TestDate.java:16)

我还需要能够满足其他可能性,例如:

2014-05-27T03:00:32.613

我只需要日期的"MM/dd/yyyy" 部分,之后的所有内容都可以忽略。我是否需要预测Using Joda Date & Time API to parse multiple formats 中解释的每种日期格式

或者可以使用通配符忽略特定模式之后的所有内容。类似的东西:

DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd%"); 

或者我可以解析字符串并在日期时间的“T”部分进行拆分,只使用出现在“T”之前的值,虽然这看起来不干净......

或者有其他方法吗?

更新:

由于不需要时间,所以不用:

String strDate = "2014-05-19T23:59:59";
DateTime dateTime = parser.parseDateTime(strDate);

将使用:

String strDate = "2014-05-19T23:59:59";
DateTime dateTime = parser.parseDateTime(strDate.substring(0, 10));

这将只解析字符串的2014-05-19 部分,这将满足多种时间格式。

【问题讨论】:

  • 你查看过 Joda ISODateTimeFormat 吗?
  • @OldCurmudgeon ISODateTimeFormat 不接受多种日期格式或允许基于多种格式格式化日期?
  • @jalopaba 谢谢。 “@krtek:好吧,在您提到的所有情况下,substring(0, 10) 都将匹配 2009-05-15 ;-)” 写在您链接问题的 cmets 之一中 - 与我正在使用的解决方案相同

标签: java date datetime jodatime


【解决方案1】:

您可以通过以下方式从日期时间(格式yyyy-MM-dd%)字符串中提取日期

1) 使用String::split

  String dateTime = "2014-05-19T23:59:59";
  String date = dateTime.split("T")[0];  

2) 使用正则表达式

  Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
  Matcher matcher = pattern.matcher(dateTime);
  if (matcher.find())
  {
     System.out.println(matcher.group());
  }  

您还可以使用正则表达式将格式yyyy-MM-dd% 更改为MM/dd/yyyy

  String dateTime = "2014-05-19T23:59:59"; 
  // pattern for 'yyyy-MM-dd%'
  Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2}).+");
  Matcher matcher = pattern.matcher(dateTime);
  if (matcher.matches())
  {
     // date in format 'MM/dd/yyyy'
     String dateInNewFormat = String.format("%s/%s/%s", 
        matcher.group(2), matcher.group(3), matcher.group(1));
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2014-08-24
    • 2022-01-19
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多