Java 如何将以毫秒为单位的字符串输入转换为日期
我有一个java方法,需要将日期从一种输入字符串格式转换为另一种。输入和输出格式必须保留所有毫秒的细节,因为这适用于时间戳通常仅相隔毫秒的流程跟踪解决方案 SimpleDataFormat似乎丢失了所有毫秒数据,只返回秒和毫秒的随机数 输入日期字符串:“05/23/2013 12:32:13.45133” 输入日期格式:“MM/dd/yyyy HH:MM:ss.SSS” 输出日期格式:“yyyymmddhhmmssss” 根据上述输入日期和格式,我得到的日期字符串是:20130523123258133。这显然与输入秒数完全不同 输入格式可能不同,但输出格式必须始终相同 以下是当前的方法:Java 如何将以毫秒为单位的字符串输入转换为日期,java,Java,我有一个java方法,需要将日期从一种输入字符串格式转换为另一种。输入和输出格式必须保留所有毫秒的细节,因为这适用于时间戳通常仅相隔毫秒的流程跟踪解决方案 SimpleDataFormat似乎丢失了所有毫秒数据,只返回秒和毫秒的随机数 输入日期字符串:“05/23/2013 12:32:13.45133” 输入日期格式:“MM/dd/yyyy HH:MM:ss.SSS” 输出日期格式:“yyyymmddhhmmssss” 根据上述输入日期和格式,我得到的日期字符串是:20130523123258
private long dateSequencer(String inputDt, String inputFormat) {
long result = 0;
try {
// Convert input date into yyyyMMddHHmmssSSS format for sequencing
SimpleDateFormat dtFrmt = new SimpleDateFormat(inputFormat);
Date dt = new Date();
dt = dtFrmt.parse(inputDt);
// input String converted to Date, now reformat to Long
dtFrmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String reFrmt = dtFrmt.format(dt);
result = Long.parseLong(reFrmt);
} catch (Exception ex) {
System.out.println("++++ Exception converting dateSequencer: " + ex.toString());
}
System.out.print("+++ABM dateSeq: [inputDt=" + inputDt + "] [inputFormat=" + inputFormat + "] [result=" + result +"]");
return result;
}
运行时的日志文件条目:
+++ABM dateSeq: [inputDt=05/23/2013 12:32:13.45133] [inputFormat=MM/dd/yyyy HH:mm:ss.SSSSS] [result=20130523123258133]
+++ABM dateSeq:[inputDt=05/23/2013 12:32:13.45133][inputFormat=MM/dd/yyyy HH:MM:ss.SSSSS][result=20130523123258133]
由于输入格式可能会更改,因此我无法手动解析输入字符串以依赖特定模式。这就是为什么我允许传递模式,并使用SimpleDataFormat转换为日期,然后再转换回字符串
我怎样才能可靠地做到这一点?有没有更有效的方法将给定的输入日期字符串转换为标准格式
谢谢 如果您可以假设在每种情况下,月、日、分、秒有2位数,年有4位数,毫秒有3位数,只是模式不同,您可以简单地执行以下操作:
public static long convert(String inputDt, String inputFormat) {
int dd = inputFormat.indexOf("dd");
int MM = inputFormat.indexOf("MM");
int yyyy = inputFormat.indexOf("yyyy");
int HH = inputFormat.indexOf("HH");
int mm = inputFormat.indexOf("mm");
int ss = inputFormat.indexOf("ss");
int SSS = inputFormat.indexOf("SSS");
return Long.valueOf(inputDt.substring(yyyy,yyyy+4) + inputDt.substring(MM, MM+2) + inputDt.substring(dd, dd+2) + inputDt.substring(HH, HH+2)
+ inputDt.substring(mm, mm+2) + inputDt.substring(ss, ss+2) + inputDt.substring(SSS,SSS+3));
}
convert("05/23/2013 12:32:13.133", "MM/dd/yyyy HH:mm:ss.SSS") yields 20130523123213133
您的输入日期字符串:“05/23/2013 12:32:13.45133”包含5位毫秒数字。这是不可能的。。。必须有3位数字。45133毫秒等于45秒133毫秒。您输入的日期字符串是日期“05/23/2013 12:32:58.133”java.time
现代方法使用java.time类,这些类在几年前就取代了有问题的旧类,如Date
&Calendar
&SimpleDateFormat
。再也不用碰那些可怕的遗留类了
定义一个格式化模式以适应类的输入
ISO 8601
顺便说一句,您想要的输出格式恰好接近标准格式。标准中的“基本”版本尽量减少了分隔符的使用:YYYY-MM-DDTHH:MM:SS.S与YYYYMMDDTHHMMSS.S,正如您所做的那样
我建议你练习使用标准格式,而不是发明自己的格式。要符合要求,请在日期部分和时间部分之间添加T
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(
String input = "05/23/2013 12:32:13.45133" DateTimeFormatter formatterInput = DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm:ss.SSSSS" ); LocalDateTime ldt = LocalDateTime.parse( input , formatterInput ); DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern( "uuuuMMddHHmmssSSS" ); String output = ldt.format( formatterOutput ); System.out.println( ldt ); System.out.println( output );