如果输入为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;
}
}
}
我想要一些自动检测日期模式的条件并更改为其他格式。
答案 0 :(得分:7)
有两个选项:
尝试使用正则表达式检查某事。像:
if (dateString.matches("\\d{4}-\\d{2}-\\d{2}")) {
...
}
尝试转换为第一个模式,如果它抛出异常,尝试转换为另一个模式(但这样做是不好的做法)
答案 1 :(得分:2)
对于日期时间工作,无需担心regex。
只需尝试使用一种格式的解析,捕获预期的异常。如果确实抛出了异常,请尝试使用其他格式进行解析。如果抛出异常,那么您知道输入意外地不是两种格式。
您正在使用现在由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)
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)
非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)
只需比较日期字符串中第一个' - '字符的位置。