关于Calendar的使用,谁能教教我?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Calendar的使用,谁能教教我?相关的知识,希望对你有一定的参考价值。

Calendar objCalendar=Calendar.getInstance();
objCalendar.set(2001,2,1);
objCalendar.add(Calendar.MONTH,-1);
objCalendar.add(Calendar.DAY_OF_MONTH,28);
1、为什么当注释掉objCalendar.add(Calendar.MONTH,-1);后得2001-03-292、不注释掉得2001-03-01
请详细回答 objCalendar.add(Calendar.MONTH,-1); 为什么加这句?而且加了后能得到正确的日期
为什么我直接加objCalendar.add(Calendar.DAY_OF_MONTH,28);会到2001-03-01呢?我输入的是2001-02-01阿只要在这个日期上加28不就行了么?能解释一下原因吗?

不好意思,小弟是个菜鸟,还有些疑问想请教
为什么objCalendar.set(2001,2,1); 之后的日期是2001-3-1,我设置的日期就是2001-02-01啊,为什么加的时候要在2001-03-01上加呢?

objCalendar.add(Calendar.MONTH,-1); 的作用就是月份减1。Calendar的月份是0-11的,因此objCalendar.set(2001,2,1); 之后的日期是2001-3-1,此时直接加上28天就是2001-03-29,如果加上objCalendar.add(Calendar.MONTH,-1); 月份减1,日期就变成了2001-2-1,此时加上28天就是2001-03-01!! 参考技术A public static final int MONTH指示月份的 get 和 set 的字段数字。这是一个特定于日历的值。在格里高利历和罗马儒略历中一年中的第一个月是 JANUARY,它为 0;最后一个月取决于一年中的月份数。 参考技术B -1代表减去一个月 参考技术C 先看看加System.out.println的结果.
import java.util.Calendar;

public class TestCalendar
public static void main(String args[])
Calendar objCalendar = Calendar.getInstance();
objCalendar.set(2001,2,1);
System.out.println(objCalendar.getTime());
objCalendar.add(Calendar.MONTH,-1);
System.out.println(objCalendar.getTime());
objCalendar.add(Calendar.DAY_OF_MONTH,28);
System.out.println(objCalendar.getTime());


注意objCalendar.set(2001,FEBRUARY,1)是合适的写法.
不鼓励:objCalendar.set(2001,2,1);

谁能解释 jdbc 结果集 getTimestamp(in,calendar) 的用例?

【中文标题】谁能解释 jdbc 结果集 getTimestamp(in,calendar) 的用例?【英文标题】:Can anyone explain the usecase of jdbc resultset getTimestamp(int,calendar)? 【发布时间】:2015-01-07 10:31:04 【问题描述】:

我说的是这个接口方法:

http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getTimestamp%28int,%20java.util.Calendar%29

最常用的实现是cachedrowset中的那个:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/com/sun/rowset/CachedRowSetImpl.java 6170 行

你会注意到这个实现做了两件很奇怪的事情:

1) 它修改作为参数传递的日历,即使还有一个返回值

2) 它从 SQL 中提取所有时间信息,毫秒除外,它来自作为参数传递的日历。

接口描述不太清楚,但假设实现是正确的 - 这个方法有什么意义?我可以理解一种方法,它需要一个日历来提取时区,而不需要修改它。但是拿一个日历,修改它,不仅提取区域,还提取毫秒......

是否有人对此 API 背后的历史/设计/推理有任何见解?

【问题讨论】:

在我看来,实现此CachedRowSet 的人不了解 JDBC API(在RowSet 的参考实现中对 JDBC 有更多的误解)。据我所知,日历应仅用于其时区信息,但 API 确实说“用于构造时间戳的 java.util.Calendar 对象” @MarkRotteveel - 是的,我就是这么想的 - 我想知道实施者是否被“为时间戳构造适当的毫秒值”这句话所欺骗 - 所以他们实际上是在毫秒内复制的... 可怕的是,这种实现永远无法“修复”——它会破坏人们一直在使用的解决方法。 【参考方案1】:

这似乎是对 JDBC API 文档的错误解释(不幸的是,javax.sql.rowset 有更多这样的错误解释)。

默认情况下,JDBC 驱动程序需要存储或检索时间或时间戳,就好像存储在数据库中的时间在 JVM 的当前时区中一样。由于这并不总是您想要的,API 提供了提供 Calendar 对象的方法,您需要使用它来派生要使用的实际时区(我不知道他们为什么不使用 java.util.TimeZone )。

这是在PreparedStatement.setTimeStamp中指定的:

使用Calendar 对象,驱动程序可以计算时间戳考虑到自定义时区。如果未指定 Calendar 对象,则驱动程序使用默认时区,即运行应用程序的虚拟机的时区。

ResultSet 中的方法 getTimestamp 遵循(或应该遵循)这些相同的规则。

因此,如果数据库存储时间“11:20”并且您的本地时区是 CET (UTC+1),则检索到的时间是 10:20 UTC (11:20 CET)。但是,如果我在 GMT 中提供 Calendar,则返回的时间应该是 11:20 UTC(12:20 CET)。

【讨论】:

【参考方案2】:

SQL 数据库以年、月、日、小时、分钟、秒等形式存储时间戳的日期和时间值。这些值指定的时间实例取决于它们所在的时区被解释(例如 2014 年 1 月 1 日。15:00:00 在欧洲与美国不同)。时区可能可能不是时间戳的一部分,具体取决于列的类型。

Java 的 java.sql.Timestampjava.util.Date 类表示时间实例,与时区无关(或者更确切地说,在固定的 UTC 时区中)。

如果 SQL 数据库中的列不存储时区信息以及日期+时间,为了从这样的时间戳创建 Java DateTimeStamp 对象需要时区,因此它可以指向特定时间实例(在参考 UTC 时区中)。

所讨论的ResultSet.getTimestamp() 方法可用于获取SQL 时间戳数据,并使用参数Calendar 对象中设置的时区信息将其转换为Java Timestamp 实例。

【讨论】:

据我所知 - 我实现了一个 JDBC 驱动程序 - Calendar 对象用于时区信息(默认 JDBC 驱动程序应该使用 JVM 的当前时区,这可以从 @987654323 推断出来@: " 使用 Calendar 对象,驱动程序可以在考虑自定义时区的情况下计算时间戳。如果未指定 Calendar 对象,则驱动程序使用默认时区,即运行应用程序的虚拟机的时区。" 我想我误解了 javadoc,我编辑了我的帖子。

以上是关于关于Calendar的使用,谁能教教我?的主要内容,如果未能解决你的问题,请参考以下文章

谁会用Xcode?教教我

2.Calendar类的使用

Calendar类小结

Calendar类小结

data,simpledateformat,和calendar

Date String Calendar之间的转换