java时间类的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java时间类的问题相关的知识,希望对你有一定的参考价值。
我做了一个员工类,里面做了如下声明:
private Calendar birthday = Calendar.getInstance();
这样只是创建了一个时间的实例,但是这个birthday实例的值要怎么初始化呢?
求大神们解释。
set(int year,
int month, int date, int hourOfDay, int minute)
设置日历字段
YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY
和 MINUTE 的值。
Calendar 类是一个抽象类,它为特定瞬间与一组诸如
YEAR、MONTH、DAY_OF_MONTH、HOUR
等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。与其他语言环境敏感类一样,Calendar 提供了一个类方法
getInstance,以获得此类型的一个通用的对象。Calendar 的
getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();Calendar
对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,例如,日语-格里高里历,日语-传统日历。Calendar
定义了某些日历字段返回值的范围,以及这些值的含义。例如,对于所有日历,日历系统第一个月的值是 MONTH ==
JANUARY。其他值是由具体子类(例如 ERA)定义的。有关此内容的细节,请参阅每个字段的文档和子类文档。获得并设置日历字段值
可以通过调用 set 方法来设置日历字段值。在需要计算时间值(距历元所经过的毫秒)或日历字段值之前,不会解释
Calendar 中的所有字段值设置。调用
get、getTimeInMillis、getTime、add
和 roll 涉及此类计算。宽松性
Calendar 有两种解释日历字段的模式,即 lenient 和
non-lenient。当 Calendar 处于 lenient
模式时,它可接受比它所生成的日历字段范围更大范围内的值。当 Calendar 重新计算日历字段值,以便由
get() 返回这些值时,所有日历字段都被标准化。例如,lenient 模式下的
GregorianCalendar 将 MONTH ==
JANUARY、DAY_OF_MONTH == 32 解释为 February 1。当 Calendar 处于 non-lenient
模式时,如果其日历字段中存在任何不一致性,它都会抛出一个异常。例如,GregorianCalendar 总是在 1
与月份的长度之间生成 DAY_OF_MONTH 值。如果已经设置了任何超出范围的字段值,那么在计算时间或日历字段值时,处于
non-lenient 模式下的 GregorianCalendar 会抛出一个异常。第一个星期
Calendar 使用两个参数定义了特定于语言环境的 7
天制星期:星期的第一天和第一个星期中的最小一天(从 1 到 7)。这些数字取自构造 Calendar
时的语言环境资源数据。还可以通过为其设置值的方法来显式地指定它们。
在设置或获得 WEEK_OF_MONTH 或 WEEK_OF_YEAR
字段时,Calendar 必须确定一个月或一年的第一个星期,以此作为参考点。一个月或一年的第一个星期被确定为开始于
getFirstDayOfWeek() 的最早七天,它最少包含那一个月或一年的
getMinimalDaysInFirstWeek() 天数。第一个星期之前的各星期编号为 ...、-1、0;之后的星期编号为
2、3、...。注意,get() 返回的标准化编号方式可能有所不同。例如,特定 Calendar
子类可能将某一年第 1 个星期之前的那个星期指定为前一年的第 n 个星期。日历字段解析
在计算日历字段中的日期和时间时,可能没有足够的信息用于计算(例如只有年和月,但没有日),或者可能有不一致的信息( 例如
"Tuesday, July 15, 1996"(格林威治时间)——实际上,1996 年 7 月 15 日是星期一
)。Calendar 将解析日历字段值,以便用以下方式确定日期和时间。
如果日历字段值中存在任何冲突,则 Calendar
将为最近设置的日历字段提供优先权。以下是日历字段的默认组合。将使用由最近设置的单个字段所确定的最近组合。对于日期字段:
YEAR + MONTH + DAY_OF_MONTH
YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
YEAR + DAY_OF_YEAR
YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
对于时间字段:
HOUR_OF_DAY
AM_PM + HOUR如果在选定的字段组合中,还有尚未设置值的任一日历字段,那么 Calendar
将使用其默认值。每个字段的默认值可能依据具体的日历系统而有所不同。例如,在 GregorianCalendar
中,字段的默认值与历元起始部分的字段值相同:即 YEAR = 1970、MONTH =
JANUARY、DAY_OF_MONTH = 1,等等。注: 对于某些特别时间的解释可能会有某些歧义,可以用下列方式解决:
23:59 是一天中的最后一分钟,而 00:00 是下一天的第一分钟。因此,1999 年 12 月 31 日的 23:59 < 2000 年 1
月 1 日的 00:00。
尽管从历史上看不够精确,但午夜也属于 "am",,中午属于 "pm",所以在同一天,12:00 am ( 午夜 ) < 12:01
am,12:00 pm ( 中午 ) < 12:01 pm。
日期或时间格式字符串不是日历定义的一部分,因为在运行时,用户必须能够修改或重写它们。可以使用 DateFormat 格式化日期。字段操作
可以使用三种方法更改日历字段:set()、add() 和
roll()。
set(f, value) 将日历字段 f 更改为
value。此外,它设置了一个内部成员变量,以指示日历字段 f 已经被更改。尽管日历字段
f 是立即更改的,但是直到下次调用
get()、getTime()、getTimeInMillis()、add()
或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set()
不会触发多次不必要的计算。使用 set()
更改日历字段的结果是,其他日历字段也可能发生更改,这取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段之后,get(f)
没必要通过调用 set 方法返回 value 集合。具体细节是通过具体的日历类确定的。
示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用
set(Calendar.MONTH, Calendar.SEPTEMBER) 将该日期设置为 1999 年 9 月 31
日。如果随后调用 getTime(),那么这是解析 1999 年 10 月 1 日的一个暂时内部表示。但是,在调用
getTime() 之前调用 set(Calendar.DAY_OF_MONTH, 30) 会将该日期设置为
1999 年 9 月 30 日,因为在调用 set() 之后没有发生重新计算。
add(f, delta) 将 delta 添加到
f 字段中。这等同于调用 set(f, get(f) + delta),但要带以下两个调整:
Add 规则 1。调用后 f 字段的值减去调用前 f 字段的值等于
delta,以字段 f
中发生的任何溢出为模。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,并将字段值调整回其范围内。
Add 规则 2。如果期望某一个更小的字段是不变的,但让它等于以前的值是不可能的,因为在字段
f
发生更改之后,或者在出现其他约束之后,比如时区偏移量发生更改,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR
是一个比 DAY_OF_MONTH
小的字段。对于不期望是不变字段的更小字段,无需进行任何调整。日历系统会确定期望不变的那些字段。
此外,与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。
示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用
add(Calendar.MONTH, 13) 将日历设置为 2000 年 9 月 30 日。Add 规则
1 将 MONTH 字段设置为 September,因为向 August 添加 13 个月得出的就是下一年的
September。因为在 GregorianCalendar 中,DAY_OF_MONTH 不可能是 9
月 31 日,所以 add 规则 2 将 DAY_OF_MONTH 设置为
30,即最可能的值。尽管它是一个更小的字段,但不能根据规则 2 调整 DAY_OF_WEEK,因为在
GregorianCalendar 中的月份发生变化时,该值也需要发生变化。
roll(f, delta) 将 delta 添加到
f 字段中,但不更改更大的字段。这等同于调用 add(f, delta),但要带以下调整:
Roll
规则。在完成调用后,更大的字段无变化。更大的字段表示一个更大的时间单元。DAY_OF_MONTH 是一个比
HOUR 大的字段。
示例:请参阅 GregorianCalendar.roll(int,
int)。使用模型。为了帮助理解 add() 和 roll()
的行为,假定有一个用户界面组件,它带有用于月、日、年和底层 GregorianCalendar
的递增或递减按钮。如果从界面上读取的日期为 1999 年 1 月 31 日,并且用户按下月份的递增按钮,那么应该得到什么?如果底层实现使用
set(),那么可以将该日期读为 1999 年 3 月 3 日。更好的结果是 1999 年 2 月 28
日。此外,如果用户再次按下月份的递增按钮,那么该日期应该读为 1999 年 3 月 31 日,而不是 1999 年 3 月 28 日。通过保存原始日期并使用
add() 或 roll(),根据是否会影响更大的字段,用户界面可以像大多数用户所期望的那样运行。
至于如何使用,可以参考JAVA API 参考技术A public class S
private Calendar birthday = Calendar.getInstance();//这时已经初始话了
public static void main(String[] args)
S s=new S();
System.out.println(s.birthday);
看Calendar中如此写道:
public static Calendar getInstance()
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
cal.sharedZone = true;
return cal;
当你的变量定义后,vm给了一块空的内存空间,而后你又写道=Calendar.getInstance(); 这时就吧得到的时间类填充内存空间。写法等于:
public class S
private Calendar birthday = null;
public static void main(String[] args)
S s=new S();
s.birthday=Calendar.getInstance();;
System.out.println(s.birthday);
只不过一种是加载时就填充内存值,一种是方法运行填充内存值。但是初始化都是在类加载时,哪怕没有赋值,vm也会赋个默认值,如int是0,对象是null。。。。。。本回答被提问者采纳
如何列出 Java 类的所有实例方法?
【中文标题】如何列出 Java 类的所有实例方法?【英文标题】:How to list all the instance methods of a Java Class? 【发布时间】:2016-01-12 22:21:53 【问题描述】:我想在我的 Java 程序中列出 Vector
类的所有实例方法。我想知道在 Java 中是否有与 Ruby 的 instance_methods
等效的方法。
如果有其他方法,请告诉我。
【问题讨论】:
Is there a simple way of obtaining all object instances of a specific class in Java的可能重复instance.getClass().getDeclaredMethods()
@nhaarman 不重复,因为 OP 想要非静态方法,而不是对象实例。
@NeplatnyUdaj 这不会返回从超类继承的方法。此外,它返回 OP 可能不想要的私有方法。
@andreas 当然。这只是开始 OP 的一个快速提示。
【参考方案1】:
要获取类的所有公共、非静态方法,包括从基类继承的方法,请执行以下操作:
for (Method method : Vector.class.getMethods())
if ((method.getModifiers() & Modifier.STATIC) == 0)
System.out.println(method);
输出 (Java 1.8.0_65)
public synchronized boolean java.util.Vector.add(java.lang.Object)
public void java.util.Vector.add(int,java.lang.Object)
public synchronized java.lang.Object java.util.Vector.remove(int)
public boolean java.util.Vector.remove(java.lang.Object)
public synchronized java.lang.Object java.util.Vector.get(int)
public synchronized boolean java.util.Vector.equals(java.lang.Object)
public synchronized java.lang.String java.util.Vector.toString()
public synchronized int java.util.Vector.hashCode()
public synchronized java.lang.Object java.util.Vector.clone()
public synchronized int java.util.Vector.indexOf(java.lang.Object,int)
public int java.util.Vector.indexOf(java.lang.Object)
public void java.util.Vector.clear()
public boolean java.util.Vector.contains(java.lang.Object)
public synchronized boolean java.util.Vector.isEmpty()
public synchronized java.util.Iterator java.util.Vector.iterator()
public synchronized int java.util.Vector.lastIndexOf(java.lang.Object,int)
public synchronized int java.util.Vector.lastIndexOf(java.lang.Object)
public synchronized void java.util.Vector.replaceAll(java.util.function.UnaryOperator)
public synchronized int java.util.Vector.size()
public synchronized java.util.List java.util.Vector.subList(int,int)
public synchronized java.lang.Object[] java.util.Vector.toArray()
public synchronized java.lang.Object[] java.util.Vector.toArray(java.lang.Object[])
public java.util.Spliterator java.util.Vector.spliterator()
public synchronized boolean java.util.Vector.addAll(int,java.util.Collection)
public synchronized boolean java.util.Vector.addAll(java.util.Collection)
public synchronized void java.util.Vector.addElement(java.lang.Object)
public synchronized java.lang.Object java.util.Vector.elementAt(int)
public java.util.Enumeration java.util.Vector.elements()
public synchronized void java.util.Vector.forEach(java.util.function.Consumer)
public synchronized java.lang.Object java.util.Vector.set(int,java.lang.Object)
public synchronized int java.util.Vector.capacity()
public synchronized void java.util.Vector.ensureCapacity(int)
public synchronized void java.util.Vector.trimToSize()
public synchronized void java.util.Vector.copyInto(java.lang.Object[])
public synchronized boolean java.util.Vector.containsAll(java.util.Collection)
public synchronized java.lang.Object java.util.Vector.firstElement()
public synchronized void java.util.Vector.insertElementAt(java.lang.Object,int)
public synchronized java.lang.Object java.util.Vector.lastElement()
public synchronized java.util.ListIterator java.util.Vector.listIterator()
public synchronized java.util.ListIterator java.util.Vector.listIterator(int)
public synchronized boolean java.util.Vector.removeAll(java.util.Collection)
public synchronized void java.util.Vector.removeAllElements()
public synchronized boolean java.util.Vector.removeElement(java.lang.Object)
public synchronized void java.util.Vector.removeElementAt(int)
public synchronized boolean java.util.Vector.removeIf(java.util.function.Predicate)
public synchronized boolean java.util.Vector.retainAll(java.util.Collection)
public synchronized void java.util.Vector.setElementAt(java.lang.Object,int)
public synchronized void java.util.Vector.setSize(int)
public synchronized void java.util.Vector.sort(java.util.Comparator)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public default java.util.stream.Stream java.util.Collection.stream()
public default java.util.stream.Stream java.util.Collection.parallelStream()
【讨论】:
只是出于好奇问一下,这个捕获方法会以匿名类型制作吗? @SGM1 匿名类是真正的类,只是没有名字。从技术上讲,确实如此,但自动生成的名称不适合您使用。所以是的,你可以打电话给myAnonymousObj.getClass().getMethods()
。
Modifier 类中有一个静态辅助方法来检查标志。致电!Modifier.isStatic(method.getModifiers())
【参考方案2】:
如果我理解正确,您想从一个类中获取所有方法的列表?
Class getMethodsFromClass = ob.getClass();
for (Method method : getMethodsFromClass.getDeclaredMethods())
if (method.getAnnotation(PostConstruct.class) != null)
System.out.println(method.getName());
【讨论】:
不客气!如果您对解决方案感到满意,请随时接受此答案。 仅供参考: 这也返回私有和受保护的方法,并且不返回从基类继承的方法。和getMethods()
一样,它返回静态方法,因此需要过滤掉它们以适应 OP 声明的“实例方法”目标。
^ 是的,这在此方法的某些特殊情况应用中很重要
@Andreas 只需轻松地为 if 条件执行 method.getAnnotation(PostConstruct.class) != null && !method.getName().contains(" static ");
。 :)
@SGM1 不要使用字符串比较排除static
。请参阅my answer 了解检查static
的正确方法。以上是关于java时间类的问题的主要内容,如果未能解决你的问题,请参考以下文章
Java日期时间API系列4-----Jdk7及以前的日期时间类的线程安全问题