从FTPClient.getModificationTime()解析日期字符串

我试图解析一个日期字符串,这是FTP服务器上文件的修改日期。 以下是代码。

String dateString = mFTPClient.getModificationTime(PDF_FILE_NAME_PS); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); Date modificationDate = dateFormat.parse(dateString.substring(dateString.indexOf(" "))); Log.v(TAG, "inside downloadservice dateString="+dateString); Log.v(TAG, "inside downloadservice modificationdate="+modificationDate.toString()); 

我在日志中得到了这个

 05-27 10:04:20.870: V/DownloadService(751): inside downloadservice dateString=213 20130523130035 05-27 10:04:20.890: V/DownloadService(751): inside downloadservice modificationdate=Sat Jul 23 07:30:35 AEDT 203 

有人可以帮我这个吗?

String #substring(int index)方法的javadoc说: 子字符串以指定索引处的字符开头,并延伸到此字符串的末尾。

这就是你遇到的问题:你没有正确使用String.substring()方法,因为在调用它时,你会收到另一个String ,它包含一个空格作为第一个字符,这就是解析器出错的原因。

这是您需要的修复:

 String dateString = mFTPClient.getModificationTime(PDF_FILE_NAME_PS); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); Date modificationDate = dateFormat.parse(dateString.substring(dateString.indexOf(" ") + 1)); 

TL;博士

 LocalDateTime.parse( "20130523130035" , DateTimeFormatter.ofPattern( "uuuuMMddHHmmss" ) ).toString() 

2013-05-23T13:00:35

java.time

现代方法使用java.time类。

您的输入缺少与UTC或时区偏移的指示。 所以我们解析为LocalDateTime 。 因此,这不是一个时刻, 不是时间轴上的特定点,而只是时间轴上约26-27小时范围内潜在时刻的概念。

 String input = "213 20130523130035".split( " " )[1] ; // Grab second piece of text from your input string, the 20130523130035 part. DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHmmss" ) ; LocalDateTime ldt = LocalDateTime.parse( input , f ) ; 

ldt.toString():2013-05-23T13:00:35


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

使用符合JDBC 4.2或更高版本的JDBC驱动程序 ,您可以直接与数据库交换java.time对象。 不需要字符串也不需要java.sql。*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。