`
joeblow
  • 浏览: 177822 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java日期类型的解析

    博客分类:
  • Java
阅读更多
从字符串解析出JAVA日期类型java.util.Date是一件相当痛苦的事情,下面就列出了一些被大量使用了的格式,可谓大观:
标准/说明示例
valid RFC 822 (2-digit year)Thu, 01 Jan 04 19:48:21 GMT
valid RFC 822 (4-digit year)Thu, 01 Jan 2004 19:48:21 GMT
invalid RFC 822 (no time)01 Jan 2004
invalid RFC 822 (no seconds)01 Jan 2004 00:00 GMT
valid W3CDTF (numeric timezone)2003-12-31T10:14:55-08:00
valid W3CDTF (UTC timezone)2003-12-31T10:14:55Z
valid W3CDTF (yyyy)2003
valid W3CDTF (yyyy-mm)2003-12
valid W3CDTF (yyyy-mm-dd)2003-12-31
valid ISO 8601 (yyyymmdd)20031231
valid ISO 8601 (-yy-mm)-03-12
valid ISO 8601 (-yymm)-0312
valid ISO 8601 (-yy-mm-dd)-03-12-31
valid ISO 8601 (yymmdd)031231
valid ISO 8601 (yyyy-o)2003-335
valid ISO 8601 (yyo)03335
valid asctimeSun Jan 4 16:29:06 PST 2004
bogus RFC 822 (invalid day/month)Thu, 31 Jun 2004 19:48:21 GMT
bogus RFC 822 (invalid month)Mon, 26 January 2004 16:31:00 EST
bogus RFC 822 (invalid timezone)Mon, 26 Jan 2004 16:31:00 ET
bogus W3CDTF (invalid hour)2003-12-31T25:14:55Z
bogus W3CDTF (invalid minute)2003-12-31T10:61:55Z
bogus W3CDTF (invalid second)2003-12-31T10:14:61Z
bogus (MSSQL)2004-07-08 23:56:58.0
bogus (MSSQL-ish, without fractional second)2004-07-08 23:56:58
bogus (Korean)2004-05-25 ? 11:23:17
bogus (Greek)Κυρ, 11 Ιο?λ 2004 12:00:00 EST
bogus (Hungarian)július-13T9:15-05:00


JodaTime虽然号称时下最流行的java date工具,但是对于这个问题也是爱莫能助,只能乖乖地进行格式匹配了。

为了不重复制造轮子,我从rssowl项目[http://www.rssowl.org/]中抽取了它的日期时间解析工具类,供各位童鞋参考:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

/**
 * Utility Class for working with <code>Dates</code>.
 * 
 * @author bpasero
 * modified by http://joeblow.iteye.com
 * 2010-11-11
 */
public class DateUtils {

	/** 1 Day in Millis */
	public static final long DAY = 24L * 60L * 60L * 1000L;

	/** 1 Week in Millis */
	public static final long WEEK = 7 * DAY;

	/* An array of custom date formats */
	private static final DateFormat[] CUSTOM_DATE_FORMATS;

	/* The Default Timezone to be used */
	private static final TimeZone TIMEZONE = TimeZone.getTimeZone("UTC"); //$NON-NLS-1$

	/**
	 * Tries different date formats to parse against the given string
	 * representation to retrieve a valid Date object.
	 * 
	 * @param strdate
	 *            Date as String
	 * @return Date The parsed Date
	 */
	public static Date parseDate(String strdate) {

		/* Return in case the string date is not set */
		if (strdate == null || strdate.length() == 0) return null;

		Date result = null;
		strdate = strdate.trim();
		if (strdate.length() > 10) {

			/* Open: deal with +4:00 (no zero before hour) */
			if ((strdate.substring(strdate.length() - 5).indexOf("+") == 0 || strdate.substring(strdate.length() - 5).indexOf("-") == 0) && strdate.substring(strdate.length() - 5).indexOf(":") == 2) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
				String sign = strdate.substring(strdate.length() - 5, strdate.length() - 4);
				strdate = strdate.substring(0, strdate.length() - 5) + sign + "0" + strdate.substring(strdate.length() - 4); //$NON-NLS-1$
			}

			String dateEnd = strdate.substring(strdate.length() - 6);

			/*
			 * try to deal with -05:00 or +02:00 at end of date replace with -0500 or
			 * +0200
			 */
			if ((dateEnd.indexOf("-") == 0 || dateEnd.indexOf("+") == 0) && dateEnd.indexOf(":") == 3) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
				if (!"GMT".equals(strdate.substring(strdate.length() - 9, strdate.length() - 6))) { //$NON-NLS-1$
					String oldDate = strdate;
					String newEnd = dateEnd.substring(0, 3) + dateEnd.substring(4);
					strdate = oldDate.substring(0, oldDate.length() - 6) + newEnd;
				}
			}
		}

		/* Try to parse the date */
		int i = 0;
		while (i < CUSTOM_DATE_FORMATS.length) {
			try {

				/*
				 * This Block needs to be synchronized, because the parse-Method in
				 * SimpleDateFormat is not Thread-Safe.
				 */
				synchronized (CUSTOM_DATE_FORMATS[i]) {
					return CUSTOM_DATE_FORMATS[i].parse(strdate);
				}
			} catch (ParseException e) {
				i++;
			} catch (NumberFormatException e) {
				i++;
			}
		}
		return result;
	}

	/** Initialize the array of common date formats and formatter */
	static {

		/* Create Date Formats */
		final String[] possibleDateFormats = { 
				/* RFC 1123 with 2-digit Year */"EEE, dd MMM yy HH:mm:ss z", 
				/* RFC 1123 with 4-digit Year */"EEE, dd MMM yyyy HH:mm:ss z", 
				/* RFC 1123 with no Timezone */"EEE, dd MMM yy HH:mm:ss", 
				/* Variant of RFC 1123 */"EEE, MMM dd yy HH:mm:ss", 
				/* RFC 1123 with no Seconds */"EEE, dd MMM yy HH:mm z", 
				/* Variant of RFC 1123 */"EEE dd MMM yyyy HH:mm:ss", 
				/* RFC 1123 with no Day */"dd MMM yy HH:mm:ss z", 
				/* RFC 1123 with no Day or Seconds */"dd MMM yy HH:mm z", 
				/* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ssZ", 
				/* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss'Z'", 
				/* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:sszzzz", 
				/* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss z", 
				/* ISO 8601 */"yyyy-MM-dd'T'HH:mm:ssz", 
				/* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss.SSSz", 
				/* ISO 8601 slightly modified */"yyyy-MM-dd'T'HHmmss.SSSz", 
				/* ISO 8601 slightly modified */"yyyy-MM-dd'T'HH:mm:ss", 
				/* ISO 8601 w/o seconds */"yyyy-MM-dd'T'HH:mmZ", 
				/* ISO 8601 w/o seconds */"yyyy-MM-dd'T'HH:mm'Z'", 
				/* RFC 1123 without Day Name */"dd MMM yyyy HH:mm:ss z", 
				/* RFC 1123 without Day Name and Seconds */"dd MMM yyyy HH:mm z", 
				/* Simple Date Format */"yyyy-MM-dd", 
				/* Simple Date Format */"MMM dd, yyyy" };

		/* Create the dateformats */
		CUSTOM_DATE_FORMATS = new SimpleDateFormat[possibleDateFormats.length];

		for (int i = 0; i < possibleDateFormats.length; i++) {
			CUSTOM_DATE_FORMATS[i] = new SimpleDateFormat(possibleDateFormats[i], Locale.ENGLISH);
			CUSTOM_DATE_FORMATS[i].setTimeZone(TIMEZONE);
		}
	}
}



调用方法:

Date d = DateUtils.parseDate("Tue, 9 Nov 2010 12:45:00 GMT");



PS:11.11真是个有纪念意义的日子啊

分享到:
评论

相关推荐

    Java日期类型控件

    Java日期类型控件是编程中常见的一种用户界面组件,它允许用户在应用程序中方便地选择日期。在Java中,处理日期和时间通常涉及到几个核心类,如`java.util.Date`,`java.time.LocalDate`(自Java 8引入),以及一些...

    JAVA日期与字符串的转换

    ### JAVA日期与字符串的转换 在Java编程中,经常需要将日期对象转化为字符串形式以便于存储或显示,或者反过来将字符串转化成日期对象来进行日期计算等操作。本文将详细介绍如何在Java中实现这两种转换。 #### 一...

    Java读取Excel表格中的日期

    // 处理日期类型的单元格 } ``` ##### 3. 日期格式的转换 一旦确认单元格包含日期格式的数据,接下来就需要将其转换为Java中的`Date`对象。这里可以使用`DataFormatter`类来帮助格式化日期: ```java ...

    MySql于Java数据类型对应列表

    通过以上对MySQL与Java数据类型对应关系的详细解析,我们可以更好地理解不同数据类型的特点及应用场景。在实际开发过程中,选择合适的数据类型对于提高程序性能和维护性至关重要。此外,了解这些类型的映射关系也有...

    JAVA日期操作类详细讲解

    接着,我们来看`java.text.SimpleDateFormat`类,它是用来格式化和解析日期的。通过自定义模式,如"yyyy-MM-dd HH:mm:ss",我们可以将`Date`对象转换为易读的字符串,反之亦然。但是,`SimpleDateFormat`不是线程...

    java 解析Excel 并判断解析的数据类型__Eclipse工程

    在Java编程环境中,解析Excel文件是一项常见的任务,特别是在数据处理、数据分析或自动化测试等领域。Eclipse作为Java开发的主流IDE,提供了丰富的工具和支持来完成这项工作。本项目名为"java 解析Excel 并判断解析...

    Java日期操作接口

    本篇文章将详细探讨Java中的日期操作接口,特别是围绕"Java日期操作接口"这个主题,以及与之相关的`DateFilter.java`文件。 首先,Java中最基础的日期类是`java.util.Date`。这个类自Java 1.0起就存在,但它的设计...

    JAVA日期判断方法小结

    "JAVA日期判断方法小结" 在JAVA语言中,日期判断是非常重要的一部分,以下是常见的日期判断方法的总结: 1. 判断某年是否为润年 判断某年是否为润年是日期判断的基本方法之一。该方法可以使用以下代码实现: ```...

    java语言日期处理大全

    以下是一些关于Java日期处理的关键知识点,这些知识点在给定的文件中有所提及: 1. **获取当前日期**: Java通过`java.util.Date`类可以获取服务器上的当前日期。创建一个Date对象即会返回当前系统时间,如`Date ...

    java所有可能的日期操作封装

    Java日期操作是编程中常见的需求,它涉及到对时间的处理、日期格式化、日期比较以及时间戳转换等。Java提供了一系列强大的API来处理日期和时间,主要包括`java.util.Date`、`java.util.Calendar`、`java.text....

    Java日期时间Date类型,long类型,String类型表现形式的转换.pdf

    在Java开发中,日期时间的处理是一个常见且重要的功能...以上就是对Java日期时间Date类型、long类型、String类型表现形式转换的详细解析。掌握了这些基本的转换方法,就能在Java项目中更加灵活高效地处理日期时间数据。

    java解析cobol数据

    1. **COBOL到Java的数据类型映射**:COBOL的数值类型(如COMP-3,PACKED-DECIMAL)和字符类型(如PIC X)需要映射到Java的相应数据类型。例如,COMP-3对应Java的byte数组,而PIC X则对应Java的String。 2. **Java...

    java日期格式化

    Java日期格式化是Java开发中常见的一项任务,它涉及到日期和时间的处理,尤其是在数据输入输出、用户界面显示以及数据库交互等场景。Java提供了一系列的类来帮助我们完成日期和时间的格式化工作,其中最常用的包括`...

    JAVA变量类型之间的相互转换

    本文将详细解析JAVA中各种基本数据类型(如`byte`、`short`、`int`、`long`、`float`、`double`)以及它们与字符型、字符串型、日期型等之间的转换机制。 #### 基本数据类型及其取值范围 - **`byte`**:取值范围为...

    Android-Java中的日期转化格式DateUtil工具类

    Java提供了多种方式来操作日期,但有时为了提高代码的可读性和可维护性,我们会创建一个工具类来封装这些操作。这里我们关注的是`DateUtil`工具类,它专门用于处理日期转换格式的操作。`DateUtil`工具类通常包含了对...

    java中日期格式的转换

    ### 一、将日期类型转换为格式化的字符串类型 在Java中,`java.util.Date`类用于表示一个特定的瞬间,即从格林尼治时间1970年1月1日00:00:00开始计算的毫秒数。为了将日期转换为人类可读的格式,我们需要使用`java....

    java的Date类型转换成MySQL的DateTime类型.docx

    2. **解析日期和时间**:利用`Date`对象的`toString()`方法获取日期和时间的字符串表示,然后通过字符串操作(如`substring()`等)提取年、月、日、时、分、秒的信息。 3. **格式化输出**:将提取的信息按照MySQL `...

    最全的java时间(日期)工具类

    4. `ZonedDateTime`:包含日期、时间和时区信息,是最全面的日期时间类型。 5. `Duration`和`Period`:分别用于表示时间的长度(以秒或纳秒为单位)和日期的长度(年、月、日)。 这些类提供了丰富的静态工厂方法、...

    iso8583实例解析银联报文(java)

    2. **字段解析**:根据位图,逐个解析每个字段,如交易类型(MTI)、商户标识码(MID)、交易金额、交易日期等。每个字段可能需要不同的解码方式,例如十进制、二进制、BCD编码等。 3. **数据转换**:解析出的二进制...

Global site tag (gtag.js) - Google Analytics