Java 秒后有 10 位小数的 SimpleDateformatter,无法转换为日期
Java SimpleDateformatter with 10 decimals after the seconds, cannot convert to Date
我正在尝试将 10 毫秒 (2018-11-02 6:05:59.1541162159 PM) 的日期字符串转换为日期,但无法获得确切的日期。
要转换的代码:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class DateFormatCheck {
private static TimeZone tz = TimeZone.getTimeZone("Asia/Colombo");
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS aa");
public static void main(String[] a){
try {
Calendar cal = Calendar.getInstance(tz);
sdf.setCalendar(cal);
cal.setTime(sdf.parse("2018-11-02 6:05:59.1541162159 PM"));
Date date = cal.getTime();
System.out.println(date);
}catch (Exception e){
e.printStackTrace();
}
}
}
输出:
Tue Nov 20 02:12:01 IST 2018
您需要先使用 SimpleDateFormat 对象格式化日期:
System.out.println(sdf.format(date));
编辑:解析问题解决后执行此操作以正确打印出来。
目前有多个问题。我 强烈 建议使用 java.time
来完成尽可能多的工作,尽管即使这样也并不容易。
如您所说,"fraction of a second" 的值有 10 位数字 - 这意味着它下降到十分之一纳秒的精度。根据我的经验,这从一开始就非常不寻常 - 而且我 认为 Java 无法处理,即使 java.time
.
我怀疑您需要先处理数据,精确到 9 位数字。那时,将值解析为 ZonedDateTime
:
相当简单
// Note this only has 9 digits of precision, not the original 10
String text = "2018-11-02 6:05:59.154116215 PM";
ZoneId zone = ZoneId.of("Asia/Colombo");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd h:mm:ss.SSSSSSSSS a", Locale.US)
.withZone(zone);
ZonedDateTime parsed = ZonedDateTime.parse(text, formatter);
System.out.println(parsed);
请注意我如何提供 SSSSSSSSS
作为秒的小数部分,以处理所有 9 位数字。另请注意,使用 h
而不是 HH
- HH
表示“一天中的 24 小时,填充 0” - 对于您的原始值,这两个部分都不正确,这使用“6”表示下午 6 点。您很少想将 H
或 HH
与 a
.
结合使用
该代码为您提供了一个 ZonedDateTime
,您可以将其转换为 Date
,如下所示:
Date date = Date.from(parsed.toInstant());
我建议您 不要 这样做,除非出于互操作的原因您确实需要这样做; Date
API 在很多方面都很讨厌。
你只需要用 SimpleDateFormatter 读取它:
System.out.println(sdf.format(date.getTime()));
如果您想使用默认日期格式阅读:
private static String[] daysOfWeek = new String[]{"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
private static TimeZone tz = TimeZone.getTimeZone("Asia/Colombo");
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS aa");
public static void main(String[] a){
try {
Calendar cal = Calendar.getInstance(tz);
sdf.setCalendar(cal);
cal.set(Calendar.AM_PM, Calendar.PM);
cal.setTime(sdf.parse("2018-11-02 6:05:59.1541162159 PM"));
System.out.println(
daysOfWeek[cal.get(Calendar.DAY_OF_WEEK)] +
new SimpleDateFormat(" dd hh:mm:ss yyyy").format(cal.getTime()));
}catch (Exception e){
e.printStackTrace();
}
}
祝你好运。
String dateText = "2018-11-02 6:05:59.1541162159 PM";
String[] parsedText = dateText.split("\.");
String[] parsedText2 = parsedText[1].split(" ");
String newText = new StringBuilder(parsedText[0]).append(" ").append(parsedText2[1]).toString();
ZoneId zone = ZoneId.of("Asia/Colombo");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd h:mm:ss a", Locale.US)
.withZone(zone);
ZonedDateTime parsed = ZonedDateTime.parse(newText, formatter).plusNanos(Long.parseLong(parsedText2[0]) / 10);
System.out.println(parsed);
我正在尝试将 10 毫秒 (2018-11-02 6:05:59.1541162159 PM) 的日期字符串转换为日期,但无法获得确切的日期。
要转换的代码:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class DateFormatCheck {
private static TimeZone tz = TimeZone.getTimeZone("Asia/Colombo");
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS aa");
public static void main(String[] a){
try {
Calendar cal = Calendar.getInstance(tz);
sdf.setCalendar(cal);
cal.setTime(sdf.parse("2018-11-02 6:05:59.1541162159 PM"));
Date date = cal.getTime();
System.out.println(date);
}catch (Exception e){
e.printStackTrace();
}
}
}
输出:
Tue Nov 20 02:12:01 IST 2018
您需要先使用 SimpleDateFormat 对象格式化日期:
System.out.println(sdf.format(date));
编辑:解析问题解决后执行此操作以正确打印出来。
目前有多个问题。我 强烈 建议使用 java.time
来完成尽可能多的工作,尽管即使这样也并不容易。
如您所说,"fraction of a second" 的值有 10 位数字 - 这意味着它下降到十分之一纳秒的精度。根据我的经验,这从一开始就非常不寻常 - 而且我 认为 Java 无法处理,即使 java.time
.
我怀疑您需要先处理数据,精确到 9 位数字。那时,将值解析为 ZonedDateTime
:
// Note this only has 9 digits of precision, not the original 10
String text = "2018-11-02 6:05:59.154116215 PM";
ZoneId zone = ZoneId.of("Asia/Colombo");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd h:mm:ss.SSSSSSSSS a", Locale.US)
.withZone(zone);
ZonedDateTime parsed = ZonedDateTime.parse(text, formatter);
System.out.println(parsed);
请注意我如何提供 SSSSSSSSS
作为秒的小数部分,以处理所有 9 位数字。另请注意,使用 h
而不是 HH
- HH
表示“一天中的 24 小时,填充 0” - 对于您的原始值,这两个部分都不正确,这使用“6”表示下午 6 点。您很少想将 H
或 HH
与 a
.
该代码为您提供了一个 ZonedDateTime
,您可以将其转换为 Date
,如下所示:
Date date = Date.from(parsed.toInstant());
我建议您 不要 这样做,除非出于互操作的原因您确实需要这样做; Date
API 在很多方面都很讨厌。
你只需要用 SimpleDateFormatter 读取它:
System.out.println(sdf.format(date.getTime()));
如果您想使用默认日期格式阅读:
private static String[] daysOfWeek = new String[]{"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
private static TimeZone tz = TimeZone.getTimeZone("Asia/Colombo");
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS aa");
public static void main(String[] a){
try {
Calendar cal = Calendar.getInstance(tz);
sdf.setCalendar(cal);
cal.set(Calendar.AM_PM, Calendar.PM);
cal.setTime(sdf.parse("2018-11-02 6:05:59.1541162159 PM"));
System.out.println(
daysOfWeek[cal.get(Calendar.DAY_OF_WEEK)] +
new SimpleDateFormat(" dd hh:mm:ss yyyy").format(cal.getTime()));
}catch (Exception e){
e.printStackTrace();
}
}
祝你好运。
String dateText = "2018-11-02 6:05:59.1541162159 PM";
String[] parsedText = dateText.split("\.");
String[] parsedText2 = parsedText[1].split(" ");
String newText = new StringBuilder(parsedText[0]).append(" ").append(parsedText2[1]).toString();
ZoneId zone = ZoneId.of("Asia/Colombo");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd h:mm:ss a", Locale.US)
.withZone(zone);
ZonedDateTime parsed = ZonedDateTime.parse(newText, formatter).plusNanos(Long.parseLong(parsedText2[0]) / 10);
System.out.println(parsed);