Java获得半个月的数量

时间:2012-04-27 12:45:32

标签: java date calendar

我想从日期开始获得一年半月的数量。 例如,我有13-Mar-2012,结果我有6个。

我尝试使用Calendar类,但无法正常工作:

    Calendar cal = (GregorianCalendar) Calendar.getInstance();
    cal.set(Calendar.DAY_OF_MONTH,13);
    cal.set(Calendar.MONTH, 2);
    cal.set(Calendar.YEAR, 2012);
    int weekNum = cal.get(Calendar.WEEK_OF_YEAR);
    System.out.println("Weeknum:" + ((weekNum/2)));

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

假设这里定义了半个月:http://en.wikipedia.org/wiki/Half-month

  Calendar cal = (GregorianCalendar) Calendar.getInstance();
  cal.set(Calendar.DAY_OF_MONTH, 13);
  cal.set(Calendar.MONTH, 2);
  cal.set(Calendar.YEAR, 2012);
  // remember, we have a zero based month
  int halfMonth = cal.get( Calendar.MONTH ) * 2 + 1;
  // 1-15 is first half-month 16-end of month is second
  int remainder = cal.get( Calendar.DAY_OF_MONTH ) / 16; 
  halfMonth += remainder;

  System.out.println( halfMonth );

答案 1 :(得分:0)

Calendar cal = (GregorianCalendar) Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH,13);
cal.set(Calendar.MONTH, 2);
cal.set(Calendar.YEAR, 2012);
int hafMonthCount = cal.get(Calendar.DAY_OF_YEAR) / 14 ;
//here you must multiply by 2 :)
System.out.println("HalfMonthCount:" + hafMonthCount );

---更新

由于您使用的概念不是用Java实现的(在法语中我们有14天的quizaine概念,但在英语中我不能说),您必须自己计算它。

答案 2 :(得分:0)

详细信息以示例显示您的代码会发生什么。假设我们有以下四个不同的WEEK_OF_YEAR

WEEK_OF_YEAR: 1
WEEK_OF_YEAR: 2
WEEK_OF_YEAR: 3
WEEK_OF_YEAR: 4

如果我们将这些值除以2,会发生什么?

WEEK_OF_YEAR: 1          (weekNum/2) = 1/2 = 0 
WEEK_OF_YEAR: 2          (weekNum/2) = 2/2 = 1
WEEK_OF_YEAR: 3          (weekNum/2) = 3/2 = 1
WEEK_OF_YEAR: 4          (weekNum/2) = 4/2 = 2

因此,代码的问题在于它会导致一年中的第一周产生值0.因此,您希望在代码中执行的操作是将(weekNum/2)替换为{ {1}}。

答案 3 :(得分:0)

如果打算astronomy Half-Month(不要与astronomy fortnight混淆),那么Answer by jarrad是正确的。但是我们现在有更多的现代类,java.time类。

enter image description here

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,法国巴黎午夜过后几分钟,在魁北克蒙特利尔的“昨天”仍然是新的一天。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld = LocalDate.now( z );

获取月份编号,1月至12月为1-12。

int monthNumber = ld.getMonthValue();  // 1-12.

将该月份数乘以2,因为每个月有两个月的一半。如果在月初,减1(例如,6变为5)。

int adjustment = ( ld.getDayOfMonth() < 16 ) ? 1 : 0 ;  // If first half of month, back off the half-month-number by 1. 
int halfMonthNumber = ( ( monthNumber * 2 ) - adjustment ); // 1-24.

天文学半月标记每个都带有英文字母A - Y,同时省略I。因此,我们从半个月数的24个字母的子集字母中提取一个字母。

int index = ( halfMonthNumber - 1 );  // Subtract one for zero-based counting.
String alphaCode = "ABCDEFGHJKLMNOPQRSTUVWXY".substring( index , index + 1 );

我没有运行那段代码,只是输入了我的头脑。使用风险自负,如有需要请修复。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。