GVKun编程网logo

为什么SimpleDateFormat解析错误的日期?(simpledateformat报错)

6

针对为什么SimpleDateFormat解析错误的日期?和simpledateformat报错这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展JavaSimpleDateFormat使用注

针对为什么SimpleDateFormat解析错误的日期?simpledateformat报错这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Java SimpleDateFormat 使用注意:不支持多线程中定义全局的(static)SimpleDateFormat、Java SimpleDateFormat:无法解析的日期异常、Java vSimpleDateFormat解析日期为'Z'文字的日期、java – SimpleDateFormat.parse() – 为不同的日期格式生成错误的日期等相关知识,希望可以帮助到你。

本文目录一览:

为什么SimpleDateFormat解析错误的日期?(simpledateformat报错)

为什么SimpleDateFormat解析错误的日期?(simpledateformat报错)

我有字符串格式的日期,我想将其解析为使用日期。

var date ="03/11/2013"

我将其解析为:

new SimpleDateFormat("MM/dd/yyyy").parse(date)

但是奇怪的是,如果我传递的是“ 03-08- 201309 hjhkjhk ”或“ 03- 88 -2013”​​或 43
-88-201378,它不会抛出错误,而是对其进行解析。

为此,我必须编写正则表达式模式以检查日期的输入是否正确。但是为什么会这样呢?

代码:

scala> val date="03/88/201309 hjhkjhk"date: java.lang.String = 03/88/201309 hjhkjhkscala> new SimpleDateFormat("MM/dd/yyyy").parse(date)res5: java.util.Date = Mon May 27 00:00:00 IST 201309

答案1

小编典典

您应该使用DateFormat.setLenient(false)

SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");df.setLenient(false);df.parse("03/88/2013"); // Throws an exception

我不确定是否可以捕获 您想要的 所有内容 -我似乎还记得,即使setLenient(false)它比您预期的宽容得多-
但它应该捕获无效的月份数。

我认为它不会捕获尾随文本,例如“ 03/01/2013
sjsjsj”。您可能使用其中的重载parse接受ParsePosition,然后在解析完成后检查当前的解析索引:

ParsePosition position = new ParsePosition(0);Date date = dateFormat.parse(text, position);if (position.getIndex() != text.length()) {    // Throw an exception or whatever else you want to do}

您还应该查看Joda Time API,它很可能允许进行更严格的解释-
而且无论如何,它通常是一种更干净的日期/时间API。

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: "Mon Jan 28 18:53:24 IST 2013

我不知道原因。

Java vSimpleDateFormat解析日期为'Z'文字的日期

Java vSimpleDateFormat解析日期为'Z'文字的日期

我正在尝试解析一个看起来像这样的日期:

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:sszyyyy-MM-dd''T''HH:mm:ssZ

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

答案1

小编典典

在此模式中,包含“ z”日期时间部分表示时区格式需要符合一般时区 “标准”,例如Pacific Standard Time; PST; GMT-08:00

“ Z”表示时区符合RFC 822时区标准,例如-0800。

我认为你需要一个DatatypeConverter ...

@Testpublic 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());}

java – SimpleDateFormat.parse() – 为不同的日期格式生成错误的日期

java – SimpleDateFormat.parse() – 为不同的日期格式生成错误的日期

下面是我使用SimpleDateFormat模式解析日期的代码:
String pattern = "yyyy-MM-dd";    
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
    Date date = format.parse("05-21-2030");
    System.out.println(date);
} catch (ParseException e) {
    e.printstacktrace();
}

您可以看到我传递给解析的日期与SimpleDateFormat中指定的日期格式不同.在这种情况下,由于格式不同,我希望有一种解雇,但它使用一些不同的日期值成功解析.我得到了输出 – Tue Mar 22 00:00:00 IST 12

当我传递相同的格式,如2030-05-21,它工作正常.

你能告诉我如何在我的代码中阻止这些事情吗?

解决方法

基本上你希望SimpleDateFormat是严格的,所以将lenient设置为false.
SimpleDateFormat format = new SimpleDateFormat(pattern);
format.setLenient(false);

关于为什么SimpleDateFormat解析错误的日期?simpledateformat报错的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Java SimpleDateFormat 使用注意:不支持多线程中定义全局的(static)SimpleDateFormat、Java SimpleDateFormat:无法解析的日期异常、Java vSimpleDateFormat解析日期为'Z'文字的日期、java – SimpleDateFormat.parse() – 为不同的日期格式生成错误的日期等相关知识的信息别忘了在本站进行查找喔。

本文标签: