`

关于java日期处理浅析

阅读更多
Java 语言的Calendar(日历),Date(日期),和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分。日期是商业逻辑计算一个关键的部分。所有的开发者都应该能够计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象。

创建一个日期对象

让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数。这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间。

import java.util.Date;

public class DateExample1 {

public static void main(String[] args) {

// Get the system date/time

Date date = new Date();

System.out.println(date.getTime());

} }

在星期六,2001年9月29日,下午大约是6:50的样子,上面的例子在系统输出设备上显示的结果是 1001803809710。值得注意的是我们使用了Date 构造函数创建一个日期对象,这个构造函数没有接受任何参数,而这个构造函数在内部使用了System.currentTimeMillis() 方法来从系统获取日期。现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了。我们如何才能以一种用户明白的格式来显示这个日期呢? 在这里类java.text.SimpleDateFormat 和它的抽象基类 java.text.DateFormat 就派得上用场了。

日期数据的定制格式

假如我们希望定制日期数据的格式,比方星期六-9月-29日-2001年. 下面的例子展示了如何完成这个工作:

import java.text.SimpleDateFormat;

import java.util.Date;

public class DateExample2 {

public static void main(String[] args) {

SimpleDateFormat bartDateFormat = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");

Date date = new Date();

System.out.println(bartDateFormat.format(date));

} }

只要通过向SimpleDateFormat 的构造函数传递格式字符串"EEE-MMMM-dd-yyyy",我们就能够指明自己想要的格式。格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分。EEEE是星期,MMMM是月,dd是日,yyyy是年。字符的个数决定了日期是如何格式化的。传递"EE-MM-dd-yy"会显示 Sat-09-29-01。

将文本数据解析成日期对象

假设我们有一个文本字符串包含了一个格式化了的日期对象,我们希望解析这个字符串并从文本日期数据创建一个日期对象。我们将再次以格式化字符串"MM-dd-yyyy" 调用SimpleDateFormat类。但是这一次,我们使用格式化解析而不是生成一个文本日期数据。我们的例子,显示在下面,将解析文本字符串"9-29-2001"并创建一个值为001736000000 的日期对象。

import java.text.SimpleDateFormat;

import java.util.Date;

public class DateExample3 {

public static void main(String[] args) {

// Create a date formatter that can parse dates of

// the form MM-dd-yyyy.

SimpleDateFormat bartDateFormat = new SimpleDateFormat("MM-dd-yyyy");

// Create a string containing a text date to be parsed.

String dateStringToParse = "9-29-2001";

try {

// Parse the text version of the date.

// We have to perform the parse method in a

// try-catch construct in case dateStringToParse

// does not contain a date in the format we are expecting.

Date date = bartDateFormat.parse(dateStringToParse);

// Now send the parsed date as a long value

// to the system output.

System.out.println(date.getTime());

}

catch (Exception ex) {

System.out.println(ex.getMessage());

}

} }

使用标准的日期格式化过程

既然我们已经可以生成和解析定制的日期格式了,让我们来看一看如何使用内建的格式化过程。方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过程。下面是我们获取了四个内建的日期格式化过程。它们包括一个短的,中等的,长的,和完整的日期格式。

import java.text.DateFormat;

import java.util.Date;

public class DateExample4 {

public static void main(String[] args) {

Date date = new Date();

DateFormat shortDateFormat = DateFormat.getDateTimeInstance(

DateFormat.SHORT, DateFormat.SHORT);

DateFormat mediumDateFormat = DateFormat.getDateTimeInstance(

DateFormat.MEDIUM, DateFormat.MEDIUM);

DateFormat longDateFormat = DateFormat.getDateTimeInstance(

DateFormat.LONG, DateFormat.LONG);

DateFormat fullDateFormat = DateFormat.getDateTimeInstance(

DateFormat.FULL, DateFormat.FULL);

System.out.println(shortDateFormat.format(date));

System.out.println(mediumDateFormat.format(date));

System.out.println(longDateFormat.format(date));

System.out.println(fullDateFormat.format(date));

}

}

注意我们在对 getDateTimeInstance的每次调用中都传递了两个值:第一个参数是日期风格,而第二个参数是时间风格。它们都是基本数据类型int(整型)。考虑到可读性,我们使用了DateFormat 类提供的常量: SHORT,MEDIUM,LONG,和 FULL。

运行我们的例子程序的时候,它将向标准输出设备输出下面的内容:

9/29/01 8:44 PM

Sep 29,2001 8:44:45 PM

September 29,2001 8:44:45 PM EDT

Saturday,September 29,2001 8:44:45 PM EDT

Calendar 类

我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。

假设你想要设置,获取,和操纵一个日期对象的各个部分,比方一个月的一天或者是一个星期的一天,为了演示这个过程,我们将使用具体的子类 java.util.GregorianCalendar。 考虑下面的例子,它计算得到下面的第十个星期五是13号。

import java.util.GregorianCalendar;

import java.util.Date;

import java.text.DateFormat;

public class DateExample5 {

public static void main(String[] args) {

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

// Create our Gregorian Calendar.

GregorianCalendar cal = new GregorianCalendar();

// Set the date and time of our calendar

// to the system´s date and time

cal.setTime(new Date());

System.out.println("System Date: " + dateFormat.format(cal.getTime()));

// Set the day of week to FRIDAY

cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);

System.out.println("After Setting Day of Week to Friday: " +dateFormat.format(cal.getTime()));

int friday13Counter = 0;

while (friday13Counter <= 10) {

// Go to the next Friday by adding 7 days.

cal.add(GregorianCalendar.DAY_OF_MONTH,7);

// If the day of month is 13 we have

// another Friday the 13th.

if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13) { friday13Counter++;

System.out.println(dateFormat.format(cal.getTime()));

}

}

}

}

在这个例子中我们作了有趣的函数调用:

cal.set(GregorianCalendar.DAY_OF_WEEK,

GregorianCalendar.FRIDAY);

和:cal.add(GregorianCalendar.DAY_OF_MONTH,7);

set 方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五。注意到这里我们使用了常量 DAY_OF_WEEK 和 FRIDAY来增强代码的可读性。add 方法让我们能够在日期上加上数值,润年的所有复杂的计算都由这个方法自动处理。

我们这个例子的输出结果是:

System Date: Saturday,September 29,2001

当我们将它设置成星期五以后就成了:

Friday,September 28,2001

Friday,September 13,2002

Friday,December 13,2002

Friday,June 13,2003

Friday,February 13,2004

Friday,August 13,2004

Friday,May 13,2005

Friday,January 13,2006

Friday,October 13,2006

Friday,April 13,2007

Friday,July 13,2007

Friday,June 13,2008

时间掌握在你的手里

有了这些Date 和Calendar 类的例子,你应该能够使用 java.util.Date,java.text.SimpleDateFormat,和 java.util.GregorianCalendar 创建许多方法了。

分享到:
评论

相关推荐

    浅析页面中Java与JavaScript脚本的区别.pdf

    浅析页面中Java与JavaScript脚本的区别 Java 与 JavaScript 脚本是两种不同的编程语言,它们在 Web 开发中扮演着重要的角色。虽然它们都可以嵌入到 HTML 页面中,但是它们的表示方式、执行过程和应用场景都是不...

    2022年浅析Java中Data类的应用Java教程.docx

    对于国际化的日期格式处理,`java.time.format.DateTimeFormatter`是更好的选择,因为它支持Unicode日期时间格式。在处理日期时间时,确保理解各种类的功能以及如何正确使用它们,可以避免不必要的复杂性和错误。

    浅析Java中Data类的应用

    Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年。这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中...

    浅析数据质量管理体系与方法--谈数据--石秀峰

    Java提供了丰富的数据处理库,如Apache Commons Lang和Apache Commons CSV,可以用于数据预处理。例如,我们可以使用这些工具进行空值检查、异常值过滤和数据类型转换。同时,利用Java 8的Stream API,可以编写简洁...

    浅析12306售票算法(java版)

    12306是中国铁路客户服务中心的官方网站,其售票系统采用了一种独特的算法来处理庞大的购票需求。本文将重点探讨12306售票算法的Java实现,以及如何在实际操作中确保公平性和效率。 一、座位编码与占位策略 12306...

    XML架构浅析.pdf

    ### XML架构浅析 #### 一、XML架构概述 XML(Extensible Markup Language)是一种标记语言,用于描述数据。XML架构定义语言(XML Schema Definition,简称XSD)为XML文档提供了一种类型系统,用于定义XML文档中的...

    浅析Java中comparator接口与Comparable接口的区别

    Comparator接口则提供了更大的灵活性,你可以根据需要创建多个比较器,这在处理复杂数据结构或需要多标准比较时非常有用。然而,缺点是每次排序都需要提供额外的比较器实例,代码可能会变得更冗余。 在实际应用中,...

    JSTL详细标签库介绍

    &lt;HTML&gt;&lt;HEAD&gt;关于java异常处理(讲义)--JSP中文网 ; charset=gb2312" http-equiv=Content-Type&gt; 关于java异常处理(讲义),JSP中文网&gt; 关于java异常处理(讲义)&gt; href=...

    浅析PHP中正则表达式的应用

    - **数据提取**:从大量文本数据中提取有用的信息,如日期、时间、网址等。 ##### 2.3 正则表达式的基本语法 正则表达式通常使用斜杠`/`作为定界符,格式为`/pattern/`。其中`pattern`是你想要匹配的模式。 #####...

    浅析无效合同的判断区别-开题报告-论文.zip

    标题中的“浅析无效合同的判断区别”是一个法律领域的议题,而非IT专业的话题。然而,由于标签中提及了“论文”,我们可以将这个话题与IT行业中的学术研究和论文写作相关技术联系起来。在IT行业的论文撰写中,涉及到...

    JavaIndex:公众号【MarkerHub】的文章分类索引,直联公众号文章链接!

    MarkerHub公众号文章索引 梳理Java知识,解析开源项目! 公众号【MarkerHub】的文章分类索引,直联公众号文章链接! 扫码关注公众号,学习...别用Date了,Java8新特性之日期处理,现在学会也不迟! 一次List对象去重失

    关于MySQL的时间进位问题浅析

    这种行为可能会导致意外的结果,尤其是在处理精确时间记录时,可能会出现记录被错误地分配到不同的日期。 为了更好地理解这个问题,我们可以通过一个示例来阐述。首先,创建一个名为`test_time`的表,包含不同精度...

    浅析JDK12的五大重要新特性(推荐)

    日本令和时代的加入,虽然看似是个微小的补充,但它能够确保Java应用程序能够与时俱进地准确表示涉及日本历史和文化的日期信息,这对于日本市场的软件产品尤其重要。 最后,NumberFormat的紧凑数字格式化支持为数字...

    浅析javascript操作 cookie对象

    JavaScript操作Cookie相对JSP或Servlet来说较为复杂,因为JSP和Servlet可以直接在服务器端处理,而JavaScript需要在客户端进行,这涉及到对用户浏览器环境的依赖和可能的安全限制。尽管如此,JavaScript的Cookie操作...

    struts2基础简要介绍

    1. **手动完成输入校验**:可以自定义验证逻辑,例如检查字符串长度、日期格式等。 2. **Struts2框架实现数据校验**:Struts2提供了内置的验证机制,可以通过注解或XML配置文件来指定验证规则。 #### 五、国际化...

Global site tag (gtag.js) - Google Analytics