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

用JAVA操作日期类型

    博客分类:
  • java
阅读更多
在JDK 1.1后,java.util.Date 类型的大多数方法已经不推荐使用了。代替它的是Calendar。

而在java.sql.Date 和 java.util.Date之间,有些微妙的关系。

如何将Date类型插入数据库中,成为好多人的一个不小的障碍。



我们将讨论下面的类:

1、具体类(和抽象类相对)java.util.Date
2、抽象类java.text.DateFormat 和它的一个具体子类,java.text.SimpleDateFormat
3、抽象类java.util.Calendar 和它的一个具体子类,java.util.GregorianCalendar

具体类可以被实例化, 但是抽象类却不能. 你首先必须实现抽象类的一个具体子类.

Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它. 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.


一、创建一个日期对象r

让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为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. 请察看Sun 公司的Web 站点获取日期格式化选项的完整的指示.


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

假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个字符串并从文本日期数据创建一个日期对象. 我们将再次以格式化字符串"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. 要知道获取时间和日期格式化过程的更多的方法和选项, 请看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

当然,并不一定要在外部插入时间,因为在数据库中,可以让它自动插入,比如:MSSQL里面,用

getdate()来插入当前时间,而在Insert时,便可以不用管它了。但有的时候还是避免不了,要手工插入

时间,以更新数据库。

六、java.util.Calendar 格式化时间

Calendar cal = new GregorianCalendar();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH)+1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
String week = "";
switch(dayOfWeek) {
case 1:
week = "星期天"; break;
case 2:
week = "星期一"; break;
case 3:
week = "星期二"; break;
case 4:
week = "星期三"; break;
case 5:
week = "星期四"; break;
case 6:
week = "星期五"; break;
default:
week = "星期六"; break;

int hour = cal.get(Calendar.HOUR_OF_DAY); // 24小时制
// int hour = cal.get(Calendar.HOUR); // 12小时制
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
String h,m,s;
if(hour<10) h = "0"+hour; else h = hour+"";
if(minute<10) m = "0"+minute; else m = minute+"";
if(second<10) s = "0"+second; else s = second+"";

在JSP中输出是:

今天是: 年月日 ::

结果: 今天是: 2006年4月14日星期五 05:35:26

2、在数据库中插入时间

PreparedStatement ps = con.prepareStatement("insert into TableName(dAddTime) values(?)");
这里有三种方式:
1) ps.setDate(1,new java.sql.Date(System.currentTimemillis()));
2) ps.setTime(2,new java.sql.Time(System.currentTimemillis()));
3) ps.setTimestamp(3,new java.sql.Timestamp(System.currentTimemillis()));
第一种只插入年月日 0000-00-00

常用格式的实现:

SimpleDateFormat formatterhwy=new SimpleDateFormat("yyyy-MM-dd");
java.util.Date syscurrentime=new java.util.Date();
String currentsysdate=formatterhwy.format(syscurrentime);

SimpleDateFormat myformatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date mycurrentime=new java.util.Date();
String mycurrentdate=myformatter.format(mycurrentime);

SimpleDateFormat formatterms=new SimpleDateFormat("yyyy-MM-dd HH:mm");
java.util.Date currentimems=new java.util.Date();
String currentdatems=formatterms.format(currentimems);

SimpleDateFormat formatterms1=new SimpleDateFormat("yyyyMMdd");
java.util.Date currentimems1=new java.util.Date();
String currentdatems1=formatterms1.format(currentimems1);

long today=System.currentTimeMillis();
java.util.Date todaytime=new java.util.Date(today);
SimpleDateFormat formattertoday=new SimpleDateFormat("yyyy-MM-dd");//今天的日期
String todaydate=formattertoday.format(todaytime);

long yestoday=today-86400000;
java.util.Date yestodaytime=new java.util.Date(yestoday);
SimpleDateFormat formatteryestoday=new SimpleDateFormat("yyyy-MM-dd");//昨天的日期
String yestodaydate=formatteryestoday.format(yestodaytime);

long lasthour=today-3600000;
java.util.Date lasthourtime=new java.util.Date(lasthour);
SimpleDateFormat formattershour=new SimpleDateFormat("yyyy-MM-dd HH:00:00");//某天的上一个小时开始时间
SimpleDateFormat formatterehour=new SimpleDateFormat("yyyy-MM-dd HH:59:59");//某天的上一个小时结束时间
String lastshourdate=formattershour.format(lasthourtime);
String lastehourdate=formatterehour.format(lasthourtime);

long fristday=System.currentTimeMillis(); //每月的第一天
java.util.Date fristdaytime=new java.util.Date(fristday);
SimpleDateFormat formatterfristday=new SimpleDateFormat("yyyy-MM-dd");//昨天的日期
String fristdate=formatterfristday.format(fristdaytime);

if(fristdate.substring(fristdate.length()-2).equals("01")){
//是
}

例子:

Calendar ca=Calendar.getInstance();
java.util.Date nowdate = new java.util.Date();//得到当前时间
ca.setTime(nowdate);
ca.set(Calendar.DAY_OF_YEAR, ca.get(Calendar.DAY_OF_YEAR)-1);//你想要前几天的,就减去几天
Date now = new Date(ca.getTimeInMillis());//这个就是前n天的时间


public static String GetWeekSAndE(int year,int weeki){//返回周开始日期和结束日期 用逗号隔开
String sdate="";
String edate="";
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.WEEK_OF_YEAR, weeki);
cal.add(Calendar.DAY_OF_YEAR, 1);
sdate=cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE);

cal.clear();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.WEEK_OF_YEAR, weeki);
cal.add(Calendar.WEEK_OF_YEAR, 1);
edate=cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE);

return sdate+","+edate;
}

import java.util.*;

public class ShowDate {

public static void main(String[] args) {

Calendar calendar = new GregorianCalendar();
Date trialTime = new Date();
calendar.setTime(trialTime);

// print out a bunch of interesting things

System.out.println("ERA: " + calendar.get(Calendar.ERA));
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
System.out.println("WEEK_OF_YEAR: "
+ calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("WEEK_OF_MONTH: "
+ calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out.println("DAY_OF_MONTH: "
+ calendar.get(Calendar.DAY_OF_MONTH));
System.out
.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
System.out
.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("DAY_OF_WEEK_IN_MONTH: "
+ calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
System.out
.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
System.out
.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
System.out.println("ZONE_OFFSET: "
+ (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000)));
System.out.println("DST_OFFSET: "
+ (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000)));
System.out.println("Current Time, with hour reset to 3");
calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override
calendar.set(Calendar.HOUR, 3);
System.out.println("ERA: " + calendar.get(Calendar.ERA));
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
System.out.println("WEEK_OF_YEAR: "
+ calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("WEEK_OF_MONTH: "
+ calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out.println("DAY_OF_MONTH: "
+ calendar.get(Calendar.DAY_OF_MONTH));
System.out
.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
System.out
.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("DAY_OF_WEEK_IN_MONTH: "
+ calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
System.out
.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
System.out
.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
System.out.println("ZONE_OFFSET: "
+ (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); // in
System.out.println("DST_OFFSET: "
+ (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); // in
}

}

分享到:
评论
1 楼 muqingren 2009-09-09  
学习了

相关推荐

    java日期类型操作工具类

    java日期类型操作工具类

    Java日期操作接口

    `DateFilter.java`可能是实现这个接口的类,它可能包含了一些过滤或者操作日期的方法,比如按照特定条件筛选日期、格式化日期、比较日期等。如果`DateFilter`是一个接口,那么它可能会定义如`filterDates(Date ...

    java实现的日期操作类

    标题提到的"java实现的日期操作类"通常指的是使用这些类来完成特定的日期计算任务,如获取星期几或计算未来的日期。 `java.util.Date`是Java早期用来表示日期和时间的类,但它的API设计并不理想,易用性较差。因此...

    JAVA日期操作类详细讲解

    在Java编程语言中,日期和时间的操作是必不可少的一部分。无论是处理日志记录、数据分析,还是构建复杂的业务逻辑,我们都需要对日期和时间进行各种操作。本篇内容将深入讲解Java中的日期操作类,这对于Java初学者来...

    java操作日期时间工具类

    本篇将重点介绍Java操作日期时间的工具类,特别是通过`DateUtil.java`这个自定义工具类的实现方式。 `java.util.Date`是Java早期用来表示日期和时间的基础类,它包含了日期和时间的信息,但没有区分日期和时间。...

    java操作日期大全

    ### Java操作日期大全 在Java开发中,对日期时间的操作是一项基本且重要的任务。本文将详细介绍如何使用Java处理各种日期类型及其转换、提取指定日期的各个组成部分、获取当前日期及指定格式、计算指定月份的天数...

    sqlserver数据库类型对应Java中的数据类型

    在 SQL Server 中,date 是一个日期类型,用于存储日期值。在 Java 中,date 对应的数据类型是 java.sql.Date。 datetime2 在 SQL Server 中,datetime2 是一个日期时间类型,用于存储日期时间值。在 Java 中,...

    Java日期类型控件

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

    java日期操作类

    日期操作类 Long转日期 字符串毫秒转日期 格式化日期转换方法,年 月 日 时 分 秒 把格式化的日期补全 把格式化的日期转化为毫秒 获取当天凌晨,夜间整点时间毫秒 校验日期是否合法 得到n天之后的日期 得到n天之后是...

    MySql于Java数据类型对应列表

    在进行数据库操作时,尤其是在使用Java进行MySQL数据库开发的过程中,正确地映射数据类型是至关重要的一步。本文将详细介绍MySQL中的各种数据类型及其在Java中的对应类型,并解释这些类型的具体含义以及它们在实际...

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

    `Date`类提供了获取和设置日期的方法,如`getYear()`, `getMonth()`, `getDate()`等,但这些方法已经被弃用,建议使用`Calendar`或Java 8的API代替。 2. **`java.util.Calendar`**: `Calendar`是一个抽象类,提供了...

    mysql时间类型对应的java类型1

    - `java.time.*`(Java 8引入的新日期时间API)的类如`LocalDate`、`LocalTime`和`LocalDateTime`也可以转换为SQL类型,通过`PreparedStatement.setObject()`方法。 - **从MySQL到Java**: - 当从数据库查询结果...

    JAVA日期与字符串的转换

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

    Oracle9i数据类型Java数据类型Schema类型对比.doc

    - TIME: 对应 Java 的 Time 类型,但 Oracle9i 中没有单独的时间类型,通常用 DATE 类型表示。 - BLOB: 对应 Java 的 Object 类型,用于存储二进制大数据。 2. Java 数据类型: - Java 的基本数据类型如 byte, ...

    java语言日期处理大全

    在Java编程中,日期处理是一项常见的任务,涉及到各种日期和时间的操作。以下是一些关于Java日期处理的关键知识点,这些知识点在给定的文件中有所提及: 1. **获取当前日期**: Java通过`java.util.Date`类可以...

    JAVA数据类型与Hibernate的类型映射

    总结来说,理解并掌握Java数据类型与Hibernate的映射关系,是使用Hibernate进行数据库操作的基础。这涉及到对Java基本类型、复杂类型以及自定义对象的映射,还包括对数据库NULL值的处理、对象关系映射以及工具的使用...

    java中将string类型转换成timestamp类型

    "Java中将String类型转换成Timestamp类型" ...将String类型转换成Timestamp类型是Java编程语言中的一种常见操作,该操作需要了解Timestamp类型的特点和限制,并使用正确的方法和技术来实现转换操作。

    Java中的基本类型和引用类型变量的区别

    在 Java 中,引用类型的变量可以通过赋值操作来改变其指向的对象,例如 MyDate a, b; a = new MyDate(); b = a;这里的 a 和 b 变量都指向同一个 MyDate 对象。 在函数传递方面,Java 中的引用类型的变量也可以作为...

    Java中数据类型和MYSQL中数据类型的对比

    Java 和 MySQL 数据类型之间的对比是理解数据库操作和应用程序开发中数据处理的关键。这两种语言的数据类型在功能和使用上都有所不同,尽管它们都用于存储和处理数据,但各自有着特定的适用场景和特点。 首先,Java...

Global site tag (gtag.js) - Google Analytics