如何使用javascript从一天开始计算月份和日期?

时间:2013-12-22 07:19:01

标签: javascript

如果天数为31,那么月份为1 天为31

如果天数为38,则月份为2,日期为7。

如果年份是长年,那么一年中的总天数是366,如果它不是一年中的总天数是365.

如此。假设年份不是长年(365天)。所以,如果我把日数计算为334.月份应该是11(11月),而日期应该是30,但我不能得到。我按照以下方式行事。

function test(days){
var day;
var month;
if(days<=31){
    month=1;
    day=days;
}
else if(days<=59){
    month=2;
    day=days-31;
}
else if(days<=90){
    month=3;
    day=days-59;
}
else if(days<=120){
    month=4;
    day=days-90;
}
else if(days<=151){
    month=5;
    day=days-120;
}
else if(days<=181){
    month=6;
    day=days-151;
}
else if(days<=212){
    month=7;
    day=days-181;
}
else if(days<=243){
    month=8;
    day=days-212;
}
else if(days<=273){
    month=9;
    day=days-243;
}
else if(days<=304){
    month=10;
    day=days-273;
}
else if(days<=334){
    month=11;
    day=days-304;
}
else if(days<=365){
    month=12;
    day=days-334;
}

    alert(month);
    alert(day);

}

6 个答案:

答案 0 :(得分:4)

保持简单愚蠢(KISS):

var year = 2013
var day_of_year = 1

var d = new Date(year, 0, day_of_year)

var day_of_month = d.getDate()
var month_of_year = d.getMonth() + 1

console.log(day_of_month)
console.log(month_of_year)

<强>附录:

关于你在评论中提出的问题(我可能已经过度疲惫,因为我不再看到评论了),为了得到某一年的日子,你可以做到以下几点:

var baseYear = 1992

var baseDate = new Date(baseYear, 0);
var extendedDate = new Date(baseYear + 1, 0, 0);

var daysInYear = 1 + ((extendedDate - baseDate) / 86400000)

console.log(daysInYear)

答案 1 :(得分:2)

您可以使用少量代码确定月份(注意,无边界检查):

function getMonth(day) {
    var i = 0;
    var sum = 0;
    var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    while(sum < day) {
        sum += days[i++];
    }
    return i;
}

甚至:

function getMonth(day) {
    var i = 0, 
        days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    for (var sum = 0; sum < day; sum += days[i++]);
    return i;
}

包括当月的日期:

function getMonthAndDay(day) {
    var i = 0, sum = 0;
    var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    while(sum < day) {
        sum += days[i++];
    }
    return [i, day - sum + days[i - 1]];
}

答案 2 :(得分:1)

var myDate=new Date();   //new date to get current year
myDate = new Date(myDate.getFullYear(), 0, 1);    //set to 1st of January (this year)

var x = 334;   //the day shift needed

myDate.setDate(myDate.getDate() + (x - 1));   //add the days to the date object we already built

var month = (myDate.getMonth() + 1);   //get the month. Add 1 since it's zero based
var day = myDate.getDate();   //get the day of month

alert(month + ' ' + day);   //do what you need to

在我的代码的注释中添加了整个过程说明。可以稍微简化一下,但我想确保您了解整个算法。

基本上,您需要在年初开始,添加所需的日期,并询问您的对象此时的日期和日期。

答案 3 :(得分:0)

它对我来说很好。在这里测试http://jsfiddle.net/PcZQ3/。刚看到代码中的拼写错误。您已将function声明为funtion

答案 4 :(得分:0)

另一种方法:

function test(dayCount) {
    var isLeapyear = false;
    var daysByMonth = [31,28,31,30,31,30,31,31,30,31,30,31];

    if (isLeapyear)
        daysByMonth = [31,29,31,30,31,30,31,31,30,31,30,31];

    var month = 1;
    var day = 1;

    var days = 0;

    for (i = 0; i < 12; i++) {       
        if ( days + daysByMonth[i] > dayCount)
        {
            day = (dayCount - days);
            break;
        }
        days += daysByMonth[i];    
        month++;
    }

    console.log('month : ' + month + ' - day : ' + day);
}

test(38);

答案 5 :(得分:0)

如果有人来这里寻找一年中的月份和日期,最好的方法是使用预先存在的库momentjs

这是使用节点的示例。首次运行npm install moment后,您可以执行此操作:

> var moment = require('moment')
> var d = moment().dayOfYear(334)
undefined
> d.format()
'2013-11-30T23:45:36-08:00'
> [d.month()+1, d.date()]
[ 11, 30 ]

+1是因为时刻使用从0开始的月份数字。

图书馆负责夏令时,时区,闰年以及您不想在自己的代码中编写的类似内容,除非您正在学习,练习或玩乐。

<强>附录

Sg'te'gmuj展示了如何使用普通JavaScript(不需要第三方库)来实现这一目标。以下是该解决方案的功能:

> function monthAndDay(year, dayOfYear) {
    var date = new Date(year, 0, dayOfYear);
    return [date.getMonth() + 1, date.getDate()]
  }

非常可爱。无论是闰年还是非闰年,它都在行动中:

> monthAndDay(2013, 334)
11,30
> monthAndDay(2012, 334)
11,29
相关问题