将字符串转换为DateTime java

将字符串转换为DateTime java,java,date-format,date-formatting,localdate,dateformatter,Java,Date Format,Date Formatting,Localdate,Dateformatter,字符串必须转换为LocalDateTime类型-“yyyy-MM-dd'T'HH:MM:ss” 几秒钟后忽略任何事情 String testDate = "2019-09-17T23:38:47"; LocalDateTime lDate = null; if (!StringUtils.isEmpty(testDate) && !"".equals(testDate)) { DateTimeFormatter for

字符串必须转换为LocalDateTime类型-“yyyy-MM-dd'T'HH:MM:ss”

几秒钟后忽略任何事情

String testDate = "2019-09-17T23:38:47";



LocalDateTime lDate = null;
            if (!StringUtils.isEmpty(testDate) && !"".equals(testDate)) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
                try {
                    sqlDate = LocalDateTime.parse(testDate, formatter);
                    log.info("Converted SQL date=" + lDate );
                } catch (Exception ex) {
                    log.error("Error in parsing lDate " +ex);
                }
            }
已尝试此代码,但秒后出现的任何错误都会被排除

String testDate = "2019-09-17T23:38:47";



LocalDateTime lDate = null;
            if (!StringUtils.isEmpty(testDate) && !"".equals(testDate)) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
                try {
                    sqlDate = LocalDateTime.parse(testDate, formatter);
                    log.info("Converted SQL date=" + lDate );
                } catch (Exception ex) {
                    log.error("Error in parsing lDate " +ex);
                }
            }
尝试以下操作:(+异常处理)

String testDate=“2019-09-17T23:38:47.342”;
SimpleDateFormat=新的SimpleDateFormat(“yyyy-MM-dd'T'HH:MM:ss”);
java.util.Date=format.parse(testDate);
LocalDateTime LocalDateTime=date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println(localDateTime);
System.out.println(localDateTime.getNano());
输出:

2019-09-17T23:38:47
0
正如你所看到的,分数秒被消除了

编辑:
下面是一个包含较新日期时间类的解决方案:

DateTimeFormatter format=new DateTimeFormatterBuilder()
.appendPattern(“yyyy-MM-dd'T'HH:MM:ss”)
.appendFraction(ChronoField.NANO秒,0,9,真)
.toFormatter();
LocalDateTime date1=LocalDateTime.parse(“2019-09-17T23:38:47”,格式)。withNano(0);
LocalDateTime date2=LocalDateTime.parse(“2019-09-17T23:38:47.342”,格式).withNano(0);
系统输出打印项次(日期1);
系统输出打印项次(日期2);
输出:

2019-09-17T23:38:47
2019-09-17T23:38:47
编辑2:
我构建了一个示例,说明如何使用正则表达式和格式字符串处理不同类型的输入:

InputDatePattern.java

公共枚举InputDatePattern
{
带有时间戳(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{0,9})“,可选.of(“yyyy-MM-dd'T'HH:MM:ss”),
没有时间戳(\\d{4}-\\d{2}-\\d{2}),可选。of(“yyyy-MM-dd”),
仅时间戳(\\d{2}:\\d{2}:\\d{2}(\\.\\d{0,9})?,可选.of(“HH:mm:ss”),
未知(“*”,可选.empty());//必须最后出现,因为元素是按顺序匹配的
私人最终模式;
专用最终可选格式化程序;
private static final LocalDate DEFAULT_DATE=LocalDate.EPOCH;
private static final LocalTime DEFAULT\u TIME=LocalTime.MIDNIGHT;
私有静态最终记录器log=Logger.getLogger(Logger.class.getName());
私有InputDatePattern(字符串正则表达式,可选格式)
{
pattern=pattern.compile(regex);
var formatter=Optional.of(新的DateTimeFormatterBuilder());
ifPresent(f->format.ifPresent(f::appendPattern));
ifPresent(f->f.appendFraction(ChronoField.NANO_秒,0,9,true));
this.formatter=formatter.map(DateTimeFormatterBuilder::toFormatter);
}
公共布尔匹配(字符串类型)
{
返回模式.matcher(type).matches();
}
公共可选toLocalDateTime(字符串dateString)
{
尝试
{
开关(本)
{
带有时间戳的案例:
返回formatter.map(f->LocalDateTime.parse(dateString,f).withNano(0));
不带时间戳的情况:
返回toLocalDate(dateString).map(日期->日期.atTime(默认时间).withNano(0));
仅限大小写时间戳_:
返回toLocalTime(dateString).map(日期->日期.atDate(默认日期).withNano(0));
案件未知:
返回可选的.empty();
违约:
抛出新的IllegalStateException(“正在尝试使用未知的InputDatePattern进行转换!”);
}
}
捕获(DateTimeParse异常)
{
log.info(如getMessage());
返回可选的.empty();
}
}
公共可选toLocalDate(字符串日期字符串)
{
尝试
{
开关(本)
{
带有时间戳的案例:
不带时间戳的情况:
返回formatter.map(f->LocalDate.parse(dateString,f));
仅限大小写时间戳_:
案件未知:
返回可选的.empty();
违约:
抛出新的IllegalStateException(“正在尝试使用未知的InputDatePattern进行转换!”);
}
}
捕获(DateTimeParse异常)
{
log.info(如getMessage());
返回可选的.empty();
}
}
公共可选toLocalTime(字符串日期字符串)
{
尝试
{
开关(本)
{
带有时间戳的案例:
仅限大小写时间戳_:
返回formatter.map(f->LocalTime.parse(dateString,f));
不带时间戳的情况:
案件未知:
返回可选的.empty();
违约:
抛出新的IllegalStateException(“正在尝试使用未知的InputDatePattern进行转换!”);
}
}
捕获(DateTimeParse异常)
{
log.info(如getMessage());
返回可选的.empty();
}
}
dateString的公共静态InputDatePattern(字符串dateString)
{
for(InputDatePattern模式:InputDatePattern.values())
{
if(pattern.matches(dateString))
回报模式;
}
返回InputDatePattern.UNKNOWN;
}
}
Demo.java

公共类演示
{
公共静态void main(字符串[]args)
{
字符串[]trying={“2019-09-17T23:38:00”,“2019-09-17T23:38:00.123”,
“2019-09-17”,“输入错误”,“09:12:13.45”};
for(字符串str:trying)
{
InputDatePattern=InputDatePattern.forDateString(str);
System.out.format(“%s的输入模式类型为%s%n”,str,pattern);
可选localDateTime=pattern.toLocalDateTime(str);
if(localDateTime.isPresent())
{
System.out.println(“对应的LocalDateTime为:“+LocalDateTime.get());
}
其他的
{
System.out.format(“LocalDateTime的未知类型!错误输入=\%s\%n”,str);