最近很多小伙伴都在问SimpleDateFormat:无法解析的日期异常和date无法解析为类型这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展DateTimeFormatter和
最近很多小伙伴都在问SimpleDateFormat:无法解析的日期异常和date无法解析为类型这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展DateTimeFormatter和SimpleDateFormat有什么区别?、Java SimpleDateFormat 使用注意:不支持多线程中定义全局的(static)SimpleDateFormat、Java SimpleDateFormat:无法解析的日期异常、Java vSimpleDateFormat解析日期为'Z'文字的日期等相关知识,下面开始了哦!
本文目录一览:- SimpleDateFormat:无法解析的日期异常(date无法解析为类型)
- DateTimeFormatter和SimpleDateFormat有什么区别?
- Java SimpleDateFormat 使用注意:不支持多线程中定义全局的(static)SimpleDateFormat
- Java SimpleDateFormat:无法解析的日期异常
- Java vSimpleDateFormat解析日期为'Z'文字的日期
SimpleDateFormat:无法解析的日期异常(date无法解析为类型)
在照顾了几个现有的帖子之后,我仍然无法使我的SimpleDateFormat解析器正常工作。这是代码:
SimpleDateFormat df = new SimpleDateFormat( "EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);try { volcanoListDate = df.parse(currentValue);} catch (ParseException e) { Log.d("DEBUG", e.toString()); Log.d("DEBUG", currentValue);}
我总是以ParseException结尾。这是调试消息的输出:
06-09 23:52:17.478:DEBUG /
DEBUG(2436):java.text.ParseException:无法解析的日期:06-09
23:52:17.478:DEBUG / DEBUG(2436):2011年6月8日星期三03:23: 55 -0500
区域设置和模式看起来还可以。我哪里错了?
答案1
小编典典解决方法如下:
SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US); try { volcanoListDate = df.parse(currentValue.replaceAll("\\p{Cntrl}", "")); } catch (ParseException e) { Log.d("VOLCANO_DEBUG", e.toString()); Log.d("VOLCANO_DEBUG", currentValue); }
重要的更改是 .replaceAll(“ \\ p {Cntrl}”,“”)
,它从解析的字符串中删除控制字符。奇怪的是,在字符串来自的xml中,我没有在Notepad ++中看到任何这些字符。但是,显然有东西正在运行。
感谢您的所有帮助!
DateTimeFormatter和SimpleDateFormat有什么区别?
DateTimeFormatter和SimpleDateFormat都是用于日期时间格式化和解析的类,但它们有以下几个区别:
1.线程安全性:
- DateTimeFormatter 是线程安全的,可以在多线程环境下共享和重用。
- SimpleDateFormat 不是线程安全的,不建议在多线程环境中共享和重用,除非使用适当的同步措施。
2.API 设计:
- DateTimeFormatter 是 Java 8 中引入的,并遵循了新的日期时间 API 的设计原则,提供了一致且易于使用的方法,支持更多的日期时间模式符号和灵活的格式化选项。
- SimpleDateFormat 是早期的 Java 日期时间 API(java.util.Date) 中的类,使用较老的设计风格,并且其 API 比较有限。
3.底层实现:
- DateTimeFormatter 使用基于解析器和格式化器的模型,底层使用 java.time.format.DateTimeFormatterBuilder 类来构建格式化模式。
- SimpleDateFormat 使用基于模式字符串的方式进行格式化和解析,底层使用 java.text.SimpleDateFormat 类。
以下是使用DateTimeFormatter和SimpleDateFormat的代码示例:
使用DateTimeFormatter示例代码:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterExample {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 格式化日期时间
LocalDateTime now = LocalDateTime.now();
String formattedDateTime = formatter.format(now);
System.out.println("格式化后的日期时间:" + formattedDateTime);
// 解析日期时间
String dateTimeString = "2023-07-03 12:30:45";
LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter);
System.out.println("解析后的日期时间:" + parsedDateTime);
}
}
打印结果:
格式化后的日期时间:2023-07-03 15:34:58
解析后的日期时间:2023-07-03T12:30:45
使用SimpleDateFormat示例代码:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatExample {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化日期时间
Date now = new Date();
String formattedDateTime = sdf.format(now);
System.out.println("格式化后的日期时间:" + formattedDateTime);
// 解析日期时间
String dateTimeString = "2023-07-03 12:30:45";
try {
Date parsedDateTime = sdf.parse(dateTimeString);
System.out.println("解析后的日期时间:" + parsedDateTime);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
打印结果:
格式化后的日期时间:2023-07-03 15:38:33
解析后的日期时间:Mon Jul 03 12:30:45 CST 2023
在这个示例中,我们分别使用了DateTimeFormatter和SimpleDateFormat来格式化和解析日期时间。它们的用法非常相似,但是需要注意的是,DateTimeFormatter是线程安全的,可以在多线程环境下共享和重用;而SimpleDateFormat不是线程安全的,不建议在多线程环境中共享和重用。
Java SimpleDateFormat 使用注意:不支持多线程中定义全局的(static)SimpleDateFormat
public class Test {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(100);
for (int i = 0; i < 20; i++) {
service.execute(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10; j++) {
try {
System.out.println(sdf.parse("2019-01-02 09:45:59"));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
});
}
}
}
运行结果:
Exception in thread "pool-1-thread-3" Exception in thread "pool-1-thread-5" java.lang.NumberFormatException: multiple points
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1101)
at java.lang.Double.parseDouble(Double.java:540)
at java.text.DigitList.getDouble(DigitList.java:168)
at java.text.DecimalFormat.parse(DecimalFormat.java:1321)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2088)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
at java.text.DateFormat.parse(DateFormat.java:355)
at com.adolph.org.Test$1.run(Test.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
java.lang.NumberFormatException: multiple points
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1101)
at java.lang.Double.parseDouble(Double.java:540)
at java.text.DigitList.getDouble(DigitList.java:168)
at java.text.DecimalFormat.parse(DecimalFormat.java:1321)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2088)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
at java.text.DateFormat.parse(DateFormat.java:355)
at com.adolph.org.Test$1.run(Test.java:91)Tue Jan 02 09:45:59 CST 2019
Tue Jan 02 09:45:59 CST 2019
Tue Jan 02 09:45:59 CST 2019
Tue Jan 02 09:45:59 CST 2019
Thu Dec 20 09:45:59 CST 2019
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Exception in thread "pool-1-thread-7" java.lang.NumberFormatException: For input string: "E.4250918E4"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
at java.lang.Double.parseDouble(Double.java:540)
at java.text.DigitList.getDouble(DigitList.java:168)
at java.text.DecimalFormat.parse(DecimalFormat.java:1321)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1793)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
Mon Dec 20 09:45:59 CST 1
at java.text.DateFormat.parse(DateFormat.java:355)
at com.adolph.org.Test$1.run(Test.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
原因:SimpleDateFormat 为线程不安全类型,不支持多线程使用同一个 SimpleDateFormat 对象
Java SimpleDateFormat:无法解析的日期异常
代码如下所示:
public static void main(String[] args){ Date date = new Date(); DateFormat dateFormat= new SimpleDateFormat("dd-MMM-yyy"); try{ Date formattedDate = dateFormat.parse(date.toString()); System.out.println(formattedDate.toString()); }catch(ParseException parseEx){ parseEx.printStackTrace(); }}
在上面的代码中,dateFormat.parse(date.toString())
抛出不可解析的日期异常:Unparseable date: "MonJan 28 18:53:24 IST 2013
我不知道原因。
答案1
小编典典为什么要将日期转换为字符串并将其解析回日期?
代码失败的原因是因为您试图使用仅接受dd-MMM-yyy格式的日期的格式化程序转换完整日期。
Java vSimpleDateFormat解析日期为'Z'文字的日期
如何解决Java vSimpleDateFormat解析日期为''Z''文字的日期?
在此模式中,包含“ z”日期时间部分表示时区格式需要符合一般时区 “标准”,例如Pacific Standard Time; PST; GMT-08:00
。
“ Z”表示时区符合RFC 822时区标准,例如-0800。
我认为你需要一个DatatypeConverter ...
@Test
public void testTimezoneIsGreenwichMeanTime() throws ParseException {
final Calendar calendar = javax.xml.bind.DatatypeConverter.parseDateTime("2010-04-05T17:16:00Z");
TestCase.assertEquals("gotten timezone", "GMT+00:00", calendar.getTimeZone().getID());
}
解决方法
我正在尝试解析一个看起来像这样的日期:
2010-04-05T17:16:00Z
这是每个http://www.ietf.org/rfc/rfc3339.txt的有效日期。“ Z”文字(引号)“ 表示UTC是指定时间的首选参考点。 ”
如果我尝试使用SimpleDateFormat和以下模式对其进行解析:
yyyy-MM-dd''T''HH:mm:ss
它将被解析为2010年美国东部时间星期一4月5日17:16:00
SimpleDateFormat 无法使用以下模式解析字符串:
yyyy-MM-dd''T''HH:mm:ssz
yyyy-MM-dd''T''HH:mm:ssZ
我可以显式设置要用于的TimeZone
以SimpleDateFormat
获得预期的输出,但我认为这不是必需的。我有什么想念的吗?有替代的日期解析器吗?
我们今天的关于SimpleDateFormat:无法解析的日期异常和date无法解析为类型的分享已经告一段落,感谢您的关注,如果您想了解更多关于DateTimeFormatter和SimpleDateFormat有什么区别?、Java SimpleDateFormat 使用注意:不支持多线程中定义全局的(static)SimpleDateFormat、Java SimpleDateFormat:无法解析的日期异常、Java vSimpleDateFormat解析日期为'Z'文字的日期的相关信息,请在本站查询。
本文标签: