Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java得到半个月的数字_Java_Date_Calendar - Fatal编程技术网

Java得到半个月的数字

Java得到半个月的数字,java,date,calendar,Java,Date,Calendar,我想从一个日期开始得到一年中半个月的od数。 例如,我有2012年3月13日,结果是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 week

我想从一个日期开始得到一年中半个月的od数。 例如,我有2012年3月13日,结果是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)));
有人能帮我吗

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概念,但在英语中,我不能说),您必须自己计算它。

假设此处定义的半月:


通过示例显示代码发生了什么的详细信息。假设我们有以下四个不同的
年中的周值

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)
替换为
((weekNum+1)/2)

如果要使用(不要与an混淆),则正确。但是现在我们有了更多的现代类,java.time类

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)

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

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如
java.util.date
.Calendar
,&
java.text.SimpleDateFormat

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中(请参阅)


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如
Interval
YearWeek
YearQuarter
,等等。

您希望得到什么结果?什么是“半个星期”?你不是应该乘以2吗?我想要6作为结果,但我有5(半个星期是14天)。@Snicolas,如果我乘以2,我有10,错误结果的两倍。啊,对不起:)我很快改变了主题名。好的,但我的结果仍然是5。你必须在hfMonthCount中加1。或者可以使用周中的天来调整值。这个解决方案不同于(在我看来)他试图实现的结果。如果我理解的话,他希望当一年中的周数为1或2时,hfMonthCount的结果为1。当一年中的第三周或第四周是第二周。您的解决方案无法做到这一点。您的解决方案只有在一年的第一天是星期一(或您所在地区的一周开始的任何一天)时才有效。我在前面的评论中所说的示例:假设:在您所在地区,一周从星期一开始,而今年的第一天是星期四。如果使用您的解决方案,则(一年中的)第13天将是前半个月的一部分。然而,第13天是星期二,因此3:d周已经开始,“半个月”的数字应该是2。这个代码有点奇怪。您应该除以2,而不是当前月份的数字。因为示例日期是2月,所以这恰好有效,但对于任何其他月份,它都会失败。我的错。简单地假设这个月是以1为基础的,因为一年中的天和一年中的周都是以1为基础的。我想知道在同一个API中混合基于0和基于1的变量的原因是什么。。。
int monthNumber = ld.getMonthValue();  // 1-12.
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.
int index = ( halfMonthNumber - 1 );  // Subtract one for zero-based counting.
String alphaCode = "ABCDEFGHJKLMNOPQRSTUVWXY".substring( index , index + 1 );