Java 日期格式更改

Java 日期格式更改,java,date,simpledateformat,date-formatting,Java,Date,Simpledateformat,Date Formatting,如果输入为01-01-2015,则应更改为2015-01-01 如果输入为2015-01-01,则应更改为01-01-2015 我使用了SimpleDataFormat,但没有得到正确的输出: //Class to change date dd-MM-yyyy to yyyy-MM-dd and vice versa public class ChangeDate { static SimpleDateFormat formatY = new SimpleDateFormat("yyyy-M

如果输入为
01-01-2015
,则应更改为
2015-01-01

如果输入为
2015-01-01
,则应更改为
01-01-2015

我使用了
SimpleDataFormat
,但没有得到正确的输出:

//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;
    }
  }
}
我需要一些自动检测日期模式并更改为其他格式的条件。

阅读关于和正则表达式的内容

Java代码(基于OP):

注意:
捕获组可以改进此匹配模式
例如:
“\\d{4}(-\\d{2}{2}”
“(\\d{2}{2}\\d{4}”

有两个选项:

  • 尝试使用正则表达式进行检查,例如:

    if (dateString.matches("\\d{4}-\\d{2}-\\d{2}")) {
        ...
    }
    
  • 尝试转换到第一个模式,若它引发异常,尝试转换到另一个模式(但这样做是不好的做法)


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

    Regex太过分了 对于约会时间的工作,不需要麻烦

    只需尝试一种格式的解析,就可以捕获预期的异常。如果确实引发了异常,请尝试使用其他格式进行分析。如果抛出异常,则您知道输入的格式都不是意外的

    java.time 您使用的是旧的麻烦的日期时间类,现在已被内置于Java8和更高版本中的框架所取代。新类的灵感来源于一个非常成功的框架,该框架旨在作为其继承者,在概念上类似,但经过了重新设计。定义为。由项目扩展。看

    LocalDate
    新的类包括一个,只用于日期值,不用于一天中的时间。正是你需要的

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

    如果由于输入与ISO 8601格式不匹配而导致第一次解析尝试失败,将抛出一个

    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.
    }
    
    另一种格式必须由编码模式指定,类似于使用SimpleDataFormat所做的操作。因此,如果我们从第一次尝试中捕获异常,请进行第二次解析尝试

    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.
        }
    }
    
    见:

    非ISO日期转换

    添加一个新的年表来标识ISO日期是另一种兼容(防破坏)的方法,可以输入日期数据并将其存储在正确的结构中(其他功能可以轻松地对数据进行操作)。见:

    “regex方法”可能会被错误的输入破坏,并且无法返回标准错误以响应任何输入(以在任何地方获得标准相同的结果)

    请参阅此线程中用户“Tardate”提供的答案:


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

    第一个连字符的位置可能?根据选择函数获取第一个连字符的位置我将尝试第一个选项我尝试了第二个选项,但它转换并给出了日期不合适。谢谢。使用异常应限于实际异常,而不是针对预期行为的处理-1.它不会抛出异常@AlmightyR@Sreemat我没说是的。第二种方法使用异常实现正常的预期行为。这是个坏习惯。这就是为什么(一半)答案是不好的-如果读者知道或理解“如何”,那么他们可能不会要求/阅读这个答案-1.@SantoshVishwakarma现在的情况是,这个答案应该作为评论发布。请添加更多解释和示例代码,使其成为完整的答案。使用异常处理非异常行为(/用于流控制)是非常糟糕的做法-1.这里需要异常处理,因为名为的核心Java方法声明异常。如果省略try/catch,代码将无法成功编译。此示例捕获由parse方法引发的特定DateTimeParseException,而不是普通异常或Throwable,因此此示例显示简洁正确的代码。@JasonPlurad Hm,
    DateTimeParseException
    是一个
    RuntimeException
    ,因此编译器不需要显式异常处理(抛出或捕获)。还是你在说别的?无论如何,
    LocalDate.parse(…)
    将在不使用try/catch-code的情况下编译。然而,如果这个解决方案是优雅的,这是另一个问题。啊,是的,你是对的。这是一个RuntumeException。如果一个方法显式声明了RuntimeException的抛出,我仍然会用try/catch块来包围它,即使它编译时没有try/catch块。谢谢。@JasonPlurad我对不良做法的评论是指“如果确实引发了异常,请尝试使用其他格式进行解析。”
    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.
        }
    }