- 浏览: 61766 次
- 性别:
- 来自: 安徽
最新评论
-
zongyaoliu:
很好用,谢谢
Notepad++也有列模式.[Notepad++] -
lxs647:
正需要O(∩_∩)O~
Notepad++也有列模式.[Notepad++] -
齐薄云天:
现在出来了一个基于 Ruby on Rails 框架的开源的项 ...
mantis简介 -
hlb1111:
svnant.jar、svnClientAdapter.jar ...
Ant+Junit+Svn实现自动单元测试 -
lianyeyu:
功能不错 但是速度不够快 好像是用php写的 应该有提升的可能 ...
mantis简介
究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历、阴(农)历之分。它们的区别在哪呢? 比如有: 实际上,在历史上有着许多种纪元的方法。它们的差异实在太大了,比如说一个人的生日是"八月八日" 那么一种可能是阳(公)历的八月八日,但也可以是阴(农)历的日期。所以为了计时的统一,必需指定一个日历的选择。那现在最为普及和通用的日历就是 "Gregorian Calendar"。也就是我们在讲述年份时常用 "公元几几年"。Calendar 抽象类定义了足够的方法,让我们能够表述日历的规则。Java 本身提供了对 "Gregorian Calendar" 规则的实现。我们从 Calendar.getInstance() 中所获得的实例就是一个 "GreogrianCalendar" 对象(与您通过 new GregorianCalendar() 获得的结果一致)。 下面的代码可以证明这一点: import java.io.*; public class WhatIsCalendar Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。 我们也可以自己的 Calendar 实现类,然后将它作为 Calendar 对象返回(面向对象的特性)。在 IBM alphaWorks 上,IBM 的开发人员实现了多种日历(http://www.alphaworks.ibm.com/tech/calendars)。同样在 Internet 上,也有对中国农历的实现。本文对如何扩展 Calendar 不作讨论,大家可以通过察看上述 Calendar 的源码来学习。 Calendar 与 Date 的转换非常简单: Calendar calendar = Calendar.getInstance(); 1. Calendar 的 set() 方法 set(int field, int value) - 是用来设置"年/月/日/小时/分钟/秒/微秒"等值 field 的定义在 Calendar 中 set(int year, int month, int day, int hour, int minute, int second) 但没有 set(int year, int month, int day, int hour, int minute, int second, int millisecond) 前面 set(int,int,int,int,int,int) 方法不会自动将 MilliSecond 清为 0。 另外,月份的起始值为0而不是1,所以要设置八月时,我们用7而不是8。 calendar.set(Calendar.MONTH, 7); 我们通常需要在程序逻辑中将它清为 0,否则可能会出现下面的情况: import java.io.*; public class WhatIsCalendarWrite 我们将 Calendar 保存到文件中 import java.io.*; public class WhatIsCalendarRead 然后再另外一个程序中取回来(模拟对数据库的存储),但是执行的结果是: NotEqual Calendar cal1 = Calendar.getInstance(); 在 Calendar 的方法中,get() 和 add() 会让 Calendar 立刻刷新。Set() 的这个特性会给我们的开发带来一些意想不到的结果。我们后面会看到这个问题。 2. Calendar 对象的容错性,Lenient 设置 import java.io.*; public class WhatIsCalendar 它的执行结果是: Tue Feb 01 00:00:00 PST 2000 3. 不稳定的 Calendar 我们知道 Calendar 是可以被 serialize 的,但是我们要注意下面的问题 import java.io.*; public class UnstableCalendar implements Serializable public static void main(String[] args) throws Exception{ 运行的结果竟然是: Thu Jan 01 00:00:00 PST 1970 它被复原到 EPOC 的起始点,我们称该 Calendar 是处于不稳定状态。这个问题的根本原因是 Java 在 serialize GregorianCalendar 时没有保存所有的信息,所以当它被恢复到内存中,又缺少足够的信息时,Calendar 会被恢复到 EPOCH 的起始值。Calendar 对象由两部分构成:字段和相对于 EPOC 的微秒时间差。字段信息是由微秒时间差计算出的,而 set() 方法不会强制 Calendar 重新计算字段。这样字段值就不对了。 下面的代码可以解决这个问题: import java.io.*; public class StableCalendar implements Serializable public static void main(String[] args) throws Exception{ 运行的结果是: Tue Aug 01 00:00:00 PDT 2000 这个问题主要会影响到在 EJB 编程中,参数对象中包含 Calendar 时。经过 Serialize/Deserialize 后,直接操作 Calendar 会产生不稳定的情况。 4. add() 与 roll() 的区别 add() 的功能非常强大,add 可以对 Calendar 的字段进行计算。如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。 add() 有两条规则: 当被修改的字段超出它可以的范围时,那么比它大的字段会自动修正。如: 另一个规则是,如果比它小的字段是不可变的(由 Calendar 的实现类决定),那么该小字段会修正到变化最小的值。 以上面的例子,9-31 就会变成 9-30,因为变化最小。 Roll() 的规则只有一条: Calendar cal1 = Calendar.getInstance(); Date类介绍 Data和Calendar类: 让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简 public class DateExample1 { System.out.println(date.getTime()); 在星期六, 2001年9月29日, 下午大约是6:50的样子, 上面的例子在系统输出设备上 System.out.println(new Date()); 则输出形式为:Tue Nov 08 14:28:07 CST 2005 那么, 现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了. 我们如 二、日期数据的定制格式 假如我们希望定制日期数据的格式, 比方星期六-9月-29日-2001年. 下面的例子展 import java.text.SimpleDateFormat; public class DateExample2 { public static void main(String[] args) { SimpleDateFormat bartDateFormat = Date date = new Date(); System.out.println(bartDateFormat.format(date)); 只要通过向SimpleDateFormat 的构造函数传递格式字符串"EEE-MMMM-dd-yyyy", 三、将文本数据解析成日期对象r 假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个 例子程序: import java.text.SimpleDateFormat; public class DateExample3 { public static void main(String[] args) { // Create a string containing a text date to be parsed. try { // Now send the parsed date as a long value 五、使用标准的日期格式化过程 既然我们已经可以生成和解析定制的日期格式了, 让我们来看一看如何使用内建的 import java.text.DateFormat; public class DateExample4 { public static void main(String[] args) { DateFormat shortDateFormat = DateFormat mediumDateFormat = DateFormat longDateFormat = DateFormat fullDateFormat = System.out.println(shortDateFormat.format(date)); 注意我们在对 getDateTimeInstance的每次调用中都传递了两个值. 第一个参数 运行我们的例子程序的时候, 它将向标准输出设备输出下面的内容:
月份的定义 - 阳`(公)历 一年12 个月,每个月的天数各不同;阴(农)历,每个月固定28天
每周的第一天 - 阳(公)历星期日是第一天;阴(农)历,星期一是第一天
import java.util.*;
{
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
if (calendar instanceof GregorianCalendar)
System.out.println("It is an instance of GregorianCalendar"t;
}
}
// 从一个 Calendar 对象中获取 Date 对象
Date date = calendar.getTime();
// 将 Date 对象反应到一个 Calendar 对象中,
// Calendar/GregorianCalendar 没有构造函数可以接受 Date 对象
// 所以我们必需先获得一个实例,然后设置 Date 对象
calendar.setTime(date);
Calendar 对象在使用时,有一些值得注意的事项:
import java.util.*;
{
public static void main(String[] args) throws Exception{
ObjectOutputStream out =
new ObjectOutputStream(
new FileOutputStream("calendar.out"t);
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 1, 0, 0, 0);
out.writeObject(cal1);
Calendar cal2 = Calendar.getInstance();
cal2.set(2000, 7, 1, 0, 0, 0);
cal2.set(Calendar.MILLISECOND, 0);
out.writeObject(cal2);
out.close();
}
}
import java.util.*;
{
public static void main(String[] args) throws Exception{
ObjectInputStream in =
new ObjectInputStream(
new FileInputStream("calendar.out"t);
Calendar cal2 = (Calendar)in.readObject();
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 1, 0, 0, 0);
if (cal1.equals(cal2))
System.out.println("Equals"t;
else
System.out.println("NotEqual"t;
System.out.println("Old calendar "+cal2.getTime().getTime());
System.out.println("New calendar "+cal1.getTime().getTime());
cal1.set(Calendar.MILLISECOND, 0);
cal2 = (Calendar)in.readObject();
if (cal1.equals(cal2))
System.out.println("Equals"t;
else
System.out.println("NotEqual"t;
System.out.println("Processed Old calendar "+cal2.getTime().getTime());
System.out.println("Processed New calendar "+cal1.getTime().getTime());
}
}
Old calendar 965113200422 <------------ 最后三位的MilliSecond与当前时间有关
New calendar 965113200059 <-----------/
Equals
Processed Old calendar 965113200000
Processed New calendar 965113200000
另外我们要注意的一点是,Calendar 为了性能原因对 set() 方法采取延缓计算的方法。在 JavaDoc 中有下面的例子来说明这个问题:
cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
cal1.set(Calendar.MONTH, Calendar.SEPTEMBER); //应该是 2000-9-31,也就是 2000-10-1
cal1.set(Calendar.DAY_OF_MONTH, 30); //如果 Calendar 转化到 2000-10-1,那么现在的结果就该是 2000-10-30
System.out.println(cal1.getTime()); //输出的是2000-9-30,说明 Calendar 不是马上就刷新其内部的记录
我们知道特定的月份有不同的日期,当一个用户给出错误的日期时,Calendar 如何处理的呢?
import java.util.*;
{
public static void main(String[] args) throws Exception{
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 1, 32, 0, 0, 0);
System.out.println(cal1.getTime());
cal1.setLenient(false);
cal1.set(2000, 1, 32, 0, 0, 0);
System.out.println(cal1.getTime());
}
}
Exception in thread "main" java.lang.IllegalArgumentException
at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:1368)
at java.util.Calendar.updateTime(Calendar.java:1508)
at java.util.Calendar.getTimeInMillis(Calendar.java:890)
at java.util.Calendar.getTime(Calendar.java:871)
at WhatIsCalendar.main(WhatIsCalendar.java:12)
当我们设置该 Calendar 为 Lenient false 时,它会依据特定的月份检查出错误的赋值。
import java.util.*;
{
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 1, 0, 0 , 0);
cal1.set(Calendar.MILLISECOND, 0);
ObjectOutputStream out =
new ObjectOutputStream(
new FileOutputStream("newCalendar.out"t);
out.writeObject(cal1);
out.close();
ObjectInputStream in =
new ObjectInputStream(
new FileInputStream("newCalendar.out"t);
Calendar cal2 = (Calendar)in.readObject();
cal2.set(Calendar.MILLISECOND, 0);
System.out.println(cal2.getTime());
}
}
import java.util.*;
{
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 1, 0, 0 , 0);
cal1.set(Calendar.MILLISECOND, 0);
ObjectOutputStream out =
new ObjectOutputStream(
new FileOutputStream("newCalendar.out"t);
out.writeObject(cal1);
out.close();
ObjectInputStream in =
new ObjectInputStream(
new FileInputStream("newCalendar.out"t);
Calendar cal2 = (Calendar)in.readObject();
cal2.get(Calendar.MILLISECOND); //先调用 get(),强制 Calendar 刷新
cal2.set(Calendar.MILLISECOND, 0);//再设值
System.out.println(cal2.getTime());
}
}
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
cal1.add(Calendar.MONTH, 1); //2000-9-31 => 2000-10-1,对吗?
System.out.println(cal1.getTime()); //结果是 2000-9-30
当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正。如:
cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日
cal1.roll(Calendar.WEEK_OF_MONTH, -1); //1999-6-1, 周二
cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日
cal1.add(Calendar.WEEK_OF_MONTH, -1); //1999-5-30, 周日
WEEK_OF_MONTH 比 MONTH 字段小,所以 roll 不能修正 MONTH 字段。
一、创建一个日期对象r
单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间.
import java.util.Date;
public static void main(String[] args) {
// Get the system date/time
Date date = new Date();
}
}
显示的结果是 1001803809710. 在这个例子中,值得注意的是我们使用了Date 构造
函数创建一个日期对象, 这个构造函数没有接受任何参数. 而这个构造函数在内部
使用了System.currentTimeMillis() 方法来从系统获取日期.如果用
何才能以一种用户明白的格式来显示这个日期呢? 在这里类java.text.
SimpleDateFormat 和它的抽象基类 java.text.DateFormat 就派得上用场了.
示了如何完成这个工作:
import java.util.Date;
new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
}
}
我们就能够指明自己想要的格式. 你应该可以看见, 格式字符串中的ASCII 字符
告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日
, yyyy是年. 字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示
Sat-09-29-01. 请察看Sun 公司的Web 站点获取日期格式化选项的完整的指示.
字符串并从文本日期数据创建一个日期对象. 我们将再次以格式化字符串
"MM-dd-yyyy" 调用SimpleDateFormat类, 但是这一次, 我们使用格式化解析而不
是生成一个文本日期数据. 我们的例子, 显示在下面, 将解析文本字符串
"9-29-2001"并创建一个值为001736000000 的日期对象.
import java.util.Date;
// Create a date formatter that can parse dates of
// the form MM-dd-yyyy.
SimpleDateFormat bartDateFormat =
new SimpleDateFormat("MM-dd-yyyy");
String dateStringToParse = "9-29-2001";
// 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);
// to the system output.
System.out.println(date.getTime());
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
格式化过程. 方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的
方法获得标准的日期格式化过程. 在下面的例子中, 我们获取了四个内建的日期格
式化过程. 它们包括一个短的, 中等的, 长的, 和完整的日期格式.
import java.util.Date;
Date date = new Date();
DateFormat.getDateTimeInstance(
DateFormat.SHORT,
DateFormat.SHORT);
DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,
DateFormat.MEDIUM);
DateFormat.getDateTimeInstance(
DateFormat.LONG,
DateFormat.LONG);
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL);
System.out.println(mediumDateFormat.format(date));
System.out.println(longDateFormat.format(date));
System.out.println(fullDateFormat.format(date));
}
}
是日期风格, 而第二个参数是时间风格. 它们都是基本数据类型int(整型). 考虑
到可读性, 我们使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和
FULL. 要知道获取时间和日期格式化过程的更多的方法和选项, 请看Sun 公司Web
站点上的解释.
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
发表评论
-
JRuby, ActiveRecord, JDBC to SQL Server
2010-12-13 15:23 980JRuby, ActiveRecord, JDBC to SQ ... -
如何知道自己的系统是Win XP32还是64
2010-09-09 18:39 2003大多数是32位系统 启动的画面就看出来了而且如果你的CPU不是 ... -
Notepad++也有列模式.[Notepad++]
2010-08-04 15:33 1848引子 一直在用Notepad++,小巧、顺手。偶尔使用Ult ... -
打开3306端口
2008-04-24 11:55 6107安装了MYSQL5.0,可是别人在访问我的数据库服务器的时候, ... -
SVN+APACHE总结
2008-04-23 16:22 1671Subversion是一个自由、开放源码的版本控制系统。它是 ... -
svn总结
2008-04-18 10:40 796由于拷贝下来乱码太多,就先链接一下吧: http://www. ... -
页面处理 (css\div\html\javascipt)等
2007-08-16 11:41 983http://webfx.eae.net/ ...
相关推荐
在Java编程语言中,`Calendar`类是一个核心的日期和时间API,它用于处理各种日历系统,而不仅仅是常见的格里高利历(Gregorian Calendar)。`Calendar`是一个抽象类,这意味着它不能直接被实例化,但是提供了`...
在Java编程语言中,`Calendar`和`Date`类是处理日期和时间的核心组件。...在阅读"JAVA Calendar,Date类详解"的相关文件后,你将能深入理解这两个类的内部机制,以及如何在实际项目中有效利用它们。
JavaCalendar是Java编程语言中用于处理日期和时间的重要类,它是`java.util.Calendar`的实现。这个源码分析将深入探讨Java中日期和时间的管理,以及如何利用`Calendar`类进行相关的操作。 首先,`Calendar`类是抽象...
### Java中的Calendar类详解 #### 一、引言 在Java中处理日期和时间非常常见,而`java.util.Calendar`类则是进行此类操作的核心工具之一。`Calendar`类提供了一系列的功能来帮助开发者处理复杂的日期计算问题,...
在Java编程语言中,`Date`和`Calendar`类是处理日期和时间的核心组件。这两个类在不同的Java版本中有着不同的使用方式和功能,对于理解Java时间处理机制至关重要。本篇将深入探讨`Date`和`Calendar`类的实例应用。 ...
Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类...
LunarCalendar返回农历(阴历)日期的JAR包 根据指定日期计算对应农历日期(这个计算方法是网上找的,最初的作者是谁已经无法考证了,感谢网络资源吧!),本人封装成好用的JAR包后发不出来,供大家免费下载! ...
JavaCalendar是一个在Java环境中用于处理和显示时间的组件,尤其在Java Swing应用中,由于J Swing自身并未内置专门的时间控件,JavaCalendar就显得尤为重要。它提供了用户友好的界面,帮助开发者实现对日期和时间的...
Java Calendar日历与Date日期的相互转换详解 Java Calendar日历与Date日期的相互转换是Java开发中的一项基本技术,掌握这项技术可以帮助开发者更好地处理日期和时间相关的操作。在本文中,我们将详细介绍Java ...
Java 中 Calendar 类用法实例详解 Java 中的 Calendar 类是一个非常重要的类,它提供了许多有用的方法和字段来处理日期和时间相关的操作。下面我们将详细介绍 Java 中 Calendar 类的用法实例。 首先,Calendar 类...
Java Calendar类的详解及使用实例 Java Calendar类是Java中一个非常重要的日期处理类,它提供了对日期的操作和处理的功能。在实际项目中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX...
Java Calendar类使用总结及使用实例 Java Calendar类是Java语言中用于处理日期和时间的类,它提供了许多方法来获取和设置日期和时间。下面是Java Calendar类的使用总结及使用实例: 1. 获取Calendar实例 Java ...
Java中的`Calendar`类是处理日期和时间的核心组件,它是一个抽象类,提供了对日期和时间的全面操作。在Java编程中,`Calendar`控件是用于创建、修改和查询日期的重要工具。这个控件的功能非常强大,可以满足各种复杂...
### Calendar日期代码详解 #### 1. Calendar 类简介 `java.util.Calendar` 类是 Java API 中用于处理日期和时间的主要类之一。它为日期和时间提供了一系列的操作方法,比如获取当前时间、增加或减少时间单位等。`...
Java中的时间类`Date`和`Calendar`是处理日期和时间的核心组件,它们在Java编程中扮演着重要的角色。在Java中,`Date`类主要用来表示特定的瞬间,精确到毫秒。而`Calendar`类则是一个抽象类,提供了比`Date`更灵活的...
在Java编程语言中,`Calendar`类是处理日期和时间的核心工具之一,它提供了一种可以操作日期和时间字段(如年、月、日、时、分、秒等)的灵活方式。`Calendar`类是抽象的,因此我们通常通过其子类如`...
Java中的Date和Calendar类是处理日期和时间的核心组件。Date类主要用于表示特定的瞬间,精确到毫秒。在早期版本的Java中,Date类的设计受到批评,因为它的API不直观且容易导致错误。为了解决这些问题,大部分日期和...
Java中的`Calendar`类是处理日期和时间的核心类,它是一个抽象类,提供了一系列方法用于在特定瞬间与一组日历字段之间进行转换和操作。自JDK 1.1起,`Calendar`类就被推荐用来处理日期和时间,因为它的功能比`Date`...
基于java的开发源码-Calendar万年历.zip 基于java的开发源码-Calendar万年历.zip 基于java的开发源码-Calendar万年历.zip 基于java的开发源码-Calendar万年历.zip 基于java的开发源码-Calendar万年历.zip 基于java的...