日期格式更改

时间:2015-12-25 19:01:34

标签: java date simpledateformat date-formatting

如果输入为01-01-2015,则应更改为2015-01-01 如果输入为2015-01-01,则应更改为01-01-2015 我使用SimpleDateFormat但没有得到正确的输出:

//Class to change date dd-MM-yyyy to yyyy-MM-dd and vice versa
public class ChangeDate {
  static SimpleDateFormat formatY = new SimpleDateFormat("yyyy-MM-dd");
  static SimpleDateFormat formatD = new SimpleDateFormat("dd-MM-yyyy");

  //This function change dd-MM-yyyy to yyyy-MM-dd
  public static String changeDtoY(String date) {
    try {
      return formatY.format(formatD.parse(date));
    }
    catch(Exception e) {
      return null;
    }
  }

  //This function change yyyy-MM-dd to dd-MM-yyyy
  public static String changeYtoD(String date) {
    try {
      return formatD.format(formatY.parse(date));
    }
    catch(Exception e) {
      return null;
    }
  }
}

我想要一些自动检测日期模式的条件并更改为其他格式。

5 个答案:

答案 0 :(得分:7)

有两个选项:

  1. 尝试使用正则表达式检查某事。像:

    if (dateString.matches("\\d{4}-\\d{2}-\\d{2}")) {
        ...
    }
    
  2. 尝试转换为第一个模式,如果它抛出异常,尝试转换为另一个模式(但这样做是不好的做法)

答案 1 :(得分:2)

正则表达式是矫枉过正

对于日期时间工作,无需担心regex

只需尝试使用一种格式的解析,捕获预期的异常。如果确实抛出了异常,请尝试使用其他格式进行解析。如果抛出异常,那么您知道输入意外地不是两种格式。

java.time

您正在使用现在由Java 8及更高版本中内置的java.time框架取代的旧麻烦的日期时间类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Oracle Tutorial

LocalDate

新类包含​​一个LocalDate,仅适用于没有时间的日期值。正是你需要的。

格式化程序

您的第一种格式可能是标准ISO 8601格式,YYYY-MM-DD。默认情况下,此格式用于java.time。

如果第一次解析尝试失败,因为输入与ISO 8601格式不匹配,则抛出DateTimeParseException

LocalDate localDate = null;  
try {
    localDate = LocalDate.parse( input );  // ISO 8601 formatter used implicitly.
} catch ( DateTimeParseException e ) {
    // Exception means the input is not in ISO 8601 format.
}

其他格式必须由与您使用SimpleDateFormat类似的编码模式指定。因此,如果我们从第一次尝试中捕获异常,请进行第二次解析尝试。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM-dd-yyyy" );
LocalDate localDate = null;  
try {
    localDate = LocalDate.parse( input );
} catch ( DateTimeParseException e ) {
    // Exception means the input is not in ISO 8601 format.
    // Try the other expected format.
    try {
        localDate = LocalDate.parse( input , formatter );
    } catch ( DateTimeParseException e ) {
        // FIXME: Unexpected input fit neither of our expected patterns.
    }
}

答案 2 :(得分:0)

了解PatternMatcher 正则表达式

Java代码(基于OP):

if (date.matches("\\d{2}-\\d{2}-\\d{4}")){
  //convert D format to Y format...
} else if(date.matches("\\d{4}-\\d{2}-\\d{2}")){
  //convert Y to D...
} else {
  throw new IllegalArgumentException("Received date format is not recognized.");
}

注意:可以使用capture groups改进此匹配模式 例如:"\\d{4}(-\\d{2}){2}""(-?\\d{2}){2}\\d{4}"

答案 3 :(得分:0)

请参阅:https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/datetime/iso/examples/StringConverter.java

非ISO日期转换 https://docs.oracle.com/javase/tutorial/datetime/iso/nonIso.html

添加标识ISO日期的新年表是另一种兼容(防破坏)意味着输入日期数据并将其存储在正确的结构中(其他功能可以轻松地对数据进行操作)。请参阅:https://docs.oracle.com/javase/8/docs/api/java/time/chrono/Chronology.html

'正则表达式方法'可以通过错误的输入来打破,并且无法返回标准错误以响应输入的内容(以便在任何地方获得标准的相同结果)。

请参阅用户提供的答案" Tardate"在这篇话题中:How to sanity check a date in java

您需要防弹输入并将其存储在正确识别的结构中,以便使用其他功能轻松操作它。

答案 4 :(得分:-2)

只需比较日期字符串中第一个' - '字符的位置。