无法将字符串转换为人类可读的格式
Unable to convert string to human-readable format
我这里的代码有什么问题?我无法 return 我想要的格式的字符串...
方法调用:
incident.setTargetDate(DateUtil.formatResolutionTime(targetDateList.get(i)));
格式化程序:
public class DateUtil {
public static String formatResolutionTime(String startDateString) {
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
Date startDate = null;
try {
startDate = df.parse(startDateString);
} catch (ParseException e) {
e.printStackTrace();
}
String newDateString = df.format(startDate);
System.out.println(newDateString);
return newDateString;
}
}
异常:
java.text.ParseException: Unparseable date: "2017-05-26T00:00:00+02:00"
at java.text.DateFormat.parse(DateFormat.java:366)
at app.util.DateUtil.formatResolutionTime(DateUtil.java:19)
at app.controller.TableViewController.retrieveTicketsForTable(TableViewController.java:194)
at app.controller.TableViewController.initialize(TableViewController.java:139)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at app.Main.start(Main.java:14)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication12(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait5(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null8(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
//System.out.println(dateFormat.format(date));
return dateFormat.format(date);
对我有用)
您需要两种格式。一种用于解析输入格式,一种用于格式化输出。
public static String formatResolutionTime(String startDateString) {
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ"); //Format for parsing the Input string
DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); //Format for formatting the output
Date startDate = null;
try {
startDate = dfParse.parse(startDateString);
} catch (ParseException e) {
e.printStackTrace();
}
String newDateString = df.format(startDate);
System.out.println(newDateString);
return newDateString;
}
您正在检查格式为 MM/DD/YYYY 的日期,但提供的日期格式为 YYYY-MM-DD。
您收到异常 Unparseable date: "2017-05-26T00:00:00+02:00"
,因为您正在尝试解析格式为 "yyyy-MM-dd'T'hh:mm:ssXXX"
的字符串,但告诉格式化程序您的字符串类型为 MM/dd/yyyy.
您的输入字符串格式为 "2017-05-26T00:00:00+02:00"
,您希望输出格式为 MM/dd/yyyy
,因此正如其他帖子中所建议的,您需要两个格式化程序。
public static String formatResolutionTime(String startDateString) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssXXX");
Date startDate = null;
try {
startDate = df.parse(startDateString);
} catch (ParseException e) {
e.printStackTrace();
}
DateFormat newFormatter = new SimpleDateFormat("MM/dd/yyyy");
String newDateString = newFormatter.format(startDate);
System.out.println(newDateString);
return newDateString;
}
您必须使用两个 DateFormat 对象:一个用于解析(输入 -> 日期),一个用于格式化(日期 -> 输出)。
您的输入是 2017-05-26T00:00:00+02:00
。让我们分解一下(参考SimpleDateFormat):
2017
:格式为yyyy
的年份
05
:格式为MM
的月份
26
:格式为 dd
的日期
T
:日期和时间的分隔符,格式为'T'
00
:格式为 HH
的小时(不是 hh
)
00
:分钟格式为mm
00
:格式为 ss
的秒数
+02:00
:格式为XXX
的时区
因此您的 SimpleDateFormat 解析器模式将是
yyyy-MM-dd'T'HH:mm:ss:XXX
补充说明
在 ParseException 的情况下,您的代码可能会导致意外行为,实际上在 try/catch 块之后,您的 startDate
将为空,格式化程序将尝试格式化空日期和 return 结果,生成一个 NullPointerException
.
也就是说,我的代码是:
private static final String PARSE_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX";
private static final String FORMAT_PATTERN = "MM/dd/yyyy";
// we cannot declare the SimpleDateFormat as static since it isn't thread-safe
public static String formatResolutionTime(String startDateString) {
try {
DateFormat parser = new SimpleDateFormat(PARSE_PATTERN);
Date startDate = parser.parse(startDateString);
DateFormat formatter = new SimpleDateFormat(FORMAT_PATTERN);
return formatter.format(startDate);
} catch (ParseException e) {
// e.printStackTrace();
return "Error"; // or whatever, but return a string here
}
}
如果没有现代答案,这一系列的答案将是不完整的。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy");
String newDateString = OffsetDateTime.parse(startDateString).format(dtf);
结果是
05/26/2017
到目前为止我读到的答案是正确的——而且已经过时了。 2017 年是时候跳过旧的 类 SimpleDateFormat
和 Date
,并使用 the newer Java date and time API,在本例中为 DateTimeFormatter
和 OffsetDateTime
。这更合适,因为您的原始日期时间字符串符合 ISO 8601,较新的 类 “理解”的格式是默认格式。所以我们不需要给出明确的解析格式(SimpleDateFormat
)。
我这里的代码有什么问题?我无法 return 我想要的格式的字符串...
方法调用:
incident.setTargetDate(DateUtil.formatResolutionTime(targetDateList.get(i)));
格式化程序:
public class DateUtil {
public static String formatResolutionTime(String startDateString) {
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
Date startDate = null;
try {
startDate = df.parse(startDateString);
} catch (ParseException e) {
e.printStackTrace();
}
String newDateString = df.format(startDate);
System.out.println(newDateString);
return newDateString;
}
}
异常:
java.text.ParseException: Unparseable date: "2017-05-26T00:00:00+02:00"
at java.text.DateFormat.parse(DateFormat.java:366)
at app.util.DateUtil.formatResolutionTime(DateUtil.java:19)
at app.controller.TableViewController.retrieveTicketsForTable(TableViewController.java:194)
at app.controller.TableViewController.initialize(TableViewController.java:139)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at app.Main.start(Main.java:14)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication12(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait5(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null8(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
//System.out.println(dateFormat.format(date));
return dateFormat.format(date);
对我有用)
您需要两种格式。一种用于解析输入格式,一种用于格式化输出。
public static String formatResolutionTime(String startDateString) {
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ"); //Format for parsing the Input string
DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); //Format for formatting the output
Date startDate = null;
try {
startDate = dfParse.parse(startDateString);
} catch (ParseException e) {
e.printStackTrace();
}
String newDateString = df.format(startDate);
System.out.println(newDateString);
return newDateString;
}
您正在检查格式为 MM/DD/YYYY 的日期,但提供的日期格式为 YYYY-MM-DD。
您收到异常 Unparseable date: "2017-05-26T00:00:00+02:00"
,因为您正在尝试解析格式为 "yyyy-MM-dd'T'hh:mm:ssXXX"
的字符串,但告诉格式化程序您的字符串类型为 MM/dd/yyyy.
您的输入字符串格式为 "2017-05-26T00:00:00+02:00"
,您希望输出格式为 MM/dd/yyyy
,因此正如其他帖子中所建议的,您需要两个格式化程序。
public static String formatResolutionTime(String startDateString) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssXXX");
Date startDate = null;
try {
startDate = df.parse(startDateString);
} catch (ParseException e) {
e.printStackTrace();
}
DateFormat newFormatter = new SimpleDateFormat("MM/dd/yyyy");
String newDateString = newFormatter.format(startDate);
System.out.println(newDateString);
return newDateString;
}
您必须使用两个 DateFormat 对象:一个用于解析(输入 -> 日期),一个用于格式化(日期 -> 输出)。
您的输入是 2017-05-26T00:00:00+02:00
。让我们分解一下(参考SimpleDateFormat):
2017
:格式为yyyy
的年份
05
:格式为MM
的月份
26
:格式为dd
的日期
T
:日期和时间的分隔符,格式为'T'
00
:格式为HH
的小时(不是hh
)00
:分钟格式为mm
00
:格式为ss
的秒数
+02:00
:格式为XXX
的时区
因此您的 SimpleDateFormat 解析器模式将是
yyyy-MM-dd'T'HH:mm:ss:XXX
补充说明
在 ParseException 的情况下,您的代码可能会导致意外行为,实际上在 try/catch 块之后,您的 startDate
将为空,格式化程序将尝试格式化空日期和 return 结果,生成一个 NullPointerException
.
也就是说,我的代码是:
private static final String PARSE_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX";
private static final String FORMAT_PATTERN = "MM/dd/yyyy";
// we cannot declare the SimpleDateFormat as static since it isn't thread-safe
public static String formatResolutionTime(String startDateString) {
try {
DateFormat parser = new SimpleDateFormat(PARSE_PATTERN);
Date startDate = parser.parse(startDateString);
DateFormat formatter = new SimpleDateFormat(FORMAT_PATTERN);
return formatter.format(startDate);
} catch (ParseException e) {
// e.printStackTrace();
return "Error"; // or whatever, but return a string here
}
}
如果没有现代答案,这一系列的答案将是不完整的。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy");
String newDateString = OffsetDateTime.parse(startDateString).format(dtf);
结果是
05/26/2017
到目前为止我读到的答案是正确的——而且已经过时了。 2017 年是时候跳过旧的 类 SimpleDateFormat
和 Date
,并使用 the newer Java date and time API,在本例中为 DateTimeFormatter
和 OffsetDateTime
。这更合适,因为您的原始日期时间字符串符合 ISO 8601,较新的 类 “理解”的格式是默认格式。所以我们不需要给出明确的解析格式(SimpleDateFormat
)。