GVKun编程网logo

SimpleDateFormat:无法解析的日期异常(date无法解析为类型)

16

最近很多小伙伴都在问SimpleDateFormat:无法解析的日期异常和date无法解析为类型这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展DateTimeFormatter和

最近很多小伙伴都在问SimpleDateFormat:无法解析的日期异常date无法解析为类型这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展DateTimeFormatter和SimpleDateFormat有什么区别?、Java SimpleDateFormat 使用注意:不支持多线程中定义全局的(static)SimpleDateFormat、Java SimpleDateFormat:无法解析的日期异常、Java vSimpleDateFormat解析日期为'Z'文字的日期等相关知识,下面开始了哦!

本文目录一览:

SimpleDateFormat:无法解析的日期异常(date无法解析为类型)

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有什么区别?

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

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:无法解析的日期异常

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'文字的日期

如何解决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

我可以显式设置要用于的TimeZoneSimpleDateFormat获得预期的输出,但我认为这不是必需的。我有什么想念的吗?有替代的日期解析器吗?

我们今天的关于SimpleDateFormat:无法解析的日期异常date无法解析为类型的分享已经告一段落,感谢您的关注,如果您想了解更多关于DateTimeFormatter和SimpleDateFormat有什么区别?、Java SimpleDateFormat 使用注意:不支持多线程中定义全局的(static)SimpleDateFormat、Java SimpleDateFormat:无法解析的日期异常、Java vSimpleDateFormat解析日期为'Z'文字的日期的相关信息,请在本站查询。

本文标签: