如果您对了解java.util.CalendarWEEK_OF_YEAR感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于了解java.util.CalendarWEEK_OF
如果您对了解java.util.Calendar WEEK_OF_YEAR感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于了解java.util.Calendar WEEK_OF_YEAR的详细内容,我们还将为您解答了解女性健康的相关问题,并且为您提供关于 正确获取星期几(Calendar.DAY_OF_WEEK)、2月来自java.util.Calendar的奇怪行为、android calendar DAY_OF_WEEK_IN_MONTH、Android java.util.Calendar-时差的有价值信息。
本文目录一览:- 了解java.util.Calendar WEEK_OF_YEAR(了解女性健康)
- 正确获取星期几(Calendar.DAY_OF_WEEK)
- 2月来自java.util.Calendar的奇怪行为
- android calendar DAY_OF_WEEK_IN_MONTH
- Android java.util.Calendar-时差
了解java.util.Calendar WEEK_OF_YEAR(了解女性健康)
我试图了解其java.util.Calendar.get(java.util.Calendar.WEEK_OF_YEAR)
工作原理,但似乎缺少一些要点。
String time = "1998-12-31"; // year month dayjava.util.Calendar date = java.util.Calendar.getInstance();date.setTime((new java.text.SimpleDateFormat("yyyy-MM-dd")).parse(time));System.err.println("Week of year = " + date.get(java.util.Calendar.WEEK_OF_YEAR));// Week of year = 1 Why ???
为什么date.get(java.util.Calendar.WEEK_OF_YEAR)
在一年的最后一周返回1?
而且,WEEK_OF_YEAR因为"1998-01-01"
是1,因为"1998-12-23"
它是52。
有人对此行为有解释吗?
答案1
小编典典从java.util.Calendar javadoc:
第一周
日历使用两个参数定义了特定于语言环境的一周工作日:一周的第一天和第一周的最少天数(从1到7)。这些数字是在构造Calendar时从语言环境资源数据中获取的。也可以通过设置其值的方法明确指定它们。在设置或获取WEEK_OF_MONTH或WEEK_OF_YEAR字段时,日历必须确定月份或年份的第一周作为参考点。每月或每年的第一周定义为最早的7天时间段,从getFirstDayOfWeek()开始,并且至少包含该月或一年中的getMinimalDaysInFirstWeek()天。在第一周之前编号为…,-1、0的周;编号为2、3,…的星期。请注意,get()返回的归一化编号可能不同。例如,特定的Calendar子类可以将一年的第1周之前的一周指定为上一年的n周。
因此,它是特定于语言环境的。在您的情况下,如果该周包含新年的日子,则将其计为新年的第1周。
您可以使用Calendar#setMinimalDaysInFirstWeek(int)更改此行为。
正确获取星期几(Calendar.DAY_OF_WEEK)
正确获取星期几(Calendar.DAY_OF_WEEK)
Java代码
- Calendar now = Calendar.getInstance();
- //一周第一天是否为星期天
- boolean isFirstSunday = (now.getFirstDayOfWeek() == Calendar.SUNDAY);
- //获取周几
- int weekDay = now.get(Calendar.DAY_OF_WEEK);
- //若一周第一天为星期天,则-1
- if(isFirstSunday){
- weekDay = weekDay - 1;
- if(weekDay == 0){
- weekDay = 7;
- }
- }
- //打印周几
- System.out.println(weekDay);
- //若当天为2014年10月13日(星期一),则打印输出:1
- //若当天为2014年10月17日(星期五),则打印输出:5
- //若当天为2014年10月19日(星期日),则打印输出:7
星期日为一周的第一天 | SUN | MON | TUE | WED | THU | FRI | SAT |
DAY_OF_WEEK返回值 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
星期一为一周的第一天 | MON | TUE | WED | THU | FRI | SAT | SUN |
DAY_OF_WEEK返回值 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
以下参考:
1. 在获取月份时,Calendar.MONTH + 1 的原因
Java中的月份遵循了罗马历中的规则:当时一年中的月份数量是不固定的,第一个月是JANUARY。而Java中Calendar.MONTH返回的数值其实是当前月距离第一个月有多少个月份的数值,JANUARY在Java中返回“0”,所以我们需要+1。
2. 在获取星期几 Calendar.DAY_OF_WEEK – 1 的原因
Java中Calendar.DAY_OF_WEEK其实表示:一周中的第几天,所以他会受到 第一天是星期几 的影响。
有些地区以星期日作为一周的第一天,而有些地区以星期一作为一周的第一天,这2种情况是需要区分的。
看下表的返回值
星期日为一周的第一天 | SUN | MON | TUE | WED | THU | FRI | SAT |
DAY_OF_WEEK返回值 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
星期一为一周的第一天 | MON | TUE | WED | THU | FRI | SAT | SUN |
DAY_OF_WEEK返回值 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
所以Calendar.DAY_OF_WEEK需要根据本地化设置的不同而确定是否需要 “-1”
Java中设置不同地区的输出可以使用 Locale.setDefault(Locale.地区名) 来实现。
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
返回的是周几,而不是一周的第几天
可以这样设置,星期第一天是星期几:
calendar.setFirstDayOfWeek(Calendar.MONDAY);
也可以设置Calendar.SUNDAY
设置好了就决定了当前日期的WEEK_OF_YEAR,但并不会改变DAY_OF_WEEK !
3. 获取日期时 Calendar.DAY_OF_MONTH 不需要特殊的操作,他直接返回一个月中的第几天
2月来自java.util.Calendar的奇怪行为
我遇到了来自java.util.Calendar的奇怪行为:
import static org.junit.Assert.*;import org.junit.Test;import java.util.Calendar;public class Tester1 { @Test public void test_monthOfDate() { assertEquals(1, monthOfDate(2013, 1, 30)); // OK assertEquals(1, monthOfDate(2013, 1, 31)); // OK // Start of February assertEquals(2, monthOfDate(2013, 2, 1)); // FAIL assertEquals(2, monthOfDate(2013, 2, 28)); // FAIL // to the end of it // and after that it is okay also assertEquals(3, monthOfDate(2013, 3, 1)); // OK } public int monthOfDate(int year, int month, int day) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month - 1); // just a simple get! but seems it is very important cal.get(Calendar.MONTH); // cal.set(Calendar.DAY_OF_MONTH, day); return cal.get(Calendar.MONTH) + 1; }}
我想知道为什么会这样吗?
答案1
小编典典问题是您要从2013年1月30日开始使用日历。
然后,您将年份设置为2013年-这不是问题。
然后,您将月份设置为1(即2月)。您希望在这里发生什么?实际发生的情况是,它会记住需要将月份设置为1,而 不是
重新计算实际时间值。根据文档(Emphsis我的),
将
在您调用to时重新计算时间值:get
set(f,value)将日历字段f更改为value。另外,它设置一个内部成员变量以指示日历字段f已更改。尽管日历字段f立即更改,但是直到下一次调用get(),getTime(),getTimeInMillis(),add()或roll()时,才重新计算日历的时间值(以毫秒为单位)。因此,对set()的多次调用不会触发多个不必要的计算。作为使用set()更改日历字段的结果,其他日历字段也可能会更改,具体取决于日历字段,日历字段值和日历系统。
此外,在重新计算日历字段之后,get(f)不一定会返回通过调用set方法设置的值。 具体情况由具体的日历类确定。
当您尝试将“ 1月30日”更改为“ 2月30日”并强制进行计算时, 实际 发生的情况是您将在3月2日结束我的工作,但是在实现上可能会有所不同。
最好的解决方法是:
- 使用
Calendar.set(year, month, date)
代替来避免此订购问题 - 首先,将Joda Time用作更明智的API。
android calendar DAY_OF_WEEK_IN_MONTH
http://zhidao.baidu.com/question/88636220.html
也就是
day 所在的周是这个月的第几周
明白了 真是被这个命名弄混了
Android java.util.Calendar-时差
我想制作日历视图以支持触摸交互.
因此,我想构建新的自定义日历视图.
我试图使视图偏移量和实际日期值之间的映射功能.
这是我的主意:
如果我可以计算出自基准日期以来的周数(以我的情况为1989-12-31),
很容易知道偏移量. HEIGHT_FOR_WEEK * NUM_OF_WEEK是非常简单的计算
知道确切的偏移量.
我的问题是这样的:
首先,我从基准日期获得了毫秒值.我将毫秒设置为
另一个日历对象.我希望与该对象有相同的日期.但实际上
是不同的日期.
mBaseDateInMillis = mBaseDate.getTimeInMillis();
mAnotherDate.setTimeInMillis(mBaseDateInMillis);
/* I expect mBaseDate == mAnotherDate.
* but it was different.
*/
这是我的代码:
public class CalendarCoordinate {
public static final long ONEWEEK_IN_MILLISECONDS = 60 * 60 * 24 * 7 * 1000;
public Calendar mBaseDate = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
public long mBaseDateInMillis = 0;
public Calendar mDate = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
public int mWeekHeight = 30;
/**
* CTOR
*/
public CalendarCoordinate() {
/* Base date is 1989-12-31 0, 0, 0
* It was Sunday and offset 0 will be mapped onto this day.
*/
mBaseDate.set(Calendar.MILLISECOND, 0);
mBaseDate.set(1989, 12, 31, 0, 0, 0);
mBaseDateInMillis = mBaseDate.getTimeInMillis();
Log.v(TAG, "BaseDate:" + mBaseDate.toString());
}
/**
* Compute DATE from Y-Offset
* @param yOffset
* @return
*/
public Calendar dateFromYOffset(int yOffset) {
long nthWeeks = yOffset / mWeekHeight;
long millsSinceBaseDate = nthWeeks * ONEWEEK_IN_MILLISECONDS;
mDate.clear();
mDate.set(Calendar.MILLISECOND, 0);
mDate.setTimeInMillis(mBaseDateInMillis + millsSinceBaseDate);
/* We SHOULD call to update mDate internal data structure.
* Java is really strange for this thing
**/
mDate.getTimeInMillis();
return mDate;
}
/**
* Compute Y-Offset from DATE
* @param date
* @return
*/
public long yOffsetFromDate(Calendar cal) {
long mills = cal.getTimeInMillis();
long nthWeeks = (mills - mBaseDateInMillis)/ONEWEEK_IN_MILLISECONDS;
return nthWeeks * mWeekHeight;
}
}
有人可以帮助我吗?我不是一个好的Java程序员.
解决方法:
这句话使我感到困惑:
/* I expect mBaseDate == mAnotherDate.
* but it was different.
*/
您是否真的想通过比较来检查是否相等:
如果(mBaseDate == mAnotherDate){System.out.println(“它们是相同的”); }
如果是这样,您的问题是您误解了“ ==”运算符在Java中的工作方式.它比较引用,而不是比较基础对象数据,并且由于这些对象是不同的对象(具有相同的值),因此始终为假.有关更多详细信息,请参见Java Notes on comparison operators.
另外,这些行对我来说真的很可疑:
/* We SHOULD call to update mDate internal data structure.
* Java is really strange for this thing
**/
mDate.getTimeInMillis();
如果Android出现需要您执行此操作的错误,我会感到非常惊讶,但是我想一切皆有可能.没有这个电话,您会遇到什么问题?
今天关于了解java.util.Calendar WEEK_OF_YEAR和了解女性健康的分享就到这里,希望大家有所收获,若想了解更多关于 正确获取星期几(Calendar.DAY_OF_WEEK)、2月来自java.util.Calendar的奇怪行为、android calendar DAY_OF_WEEK_IN_MONTH、Android java.util.Calendar-时差等相关知识,可以在本站进行查询。
本文标签: