【问题标题】:How to calculate month from number of days in JavaScript如何根据 JavaScript 中的天数计算月份
【发布时间】:2014-04-28 09:30:51
【问题描述】:

所以基本上我做了一个增加时钟时间的计算:

function Clock(year,month,day,hours,minutes,seconds){

  if(seconds !== null){
  this.seconds = seconds;
  }

  if(minutes !== null){
  this.minutes = minutes;
  }

  if(hours !== null){
  this.hours = hours;
  }

   if(day !== null){
  this.day = day;
  }

  if(month !== null){
  this.month = month;
  }

  if(year !== null){
  this.year = year;
  }

}


function incrementClock(){

clock.seconds++;
  if (clock.seconds >=60) {
    clock.seconds = 0;
    clock.minutes++;
    if (clock.minutes >=60) {
      clock.minutes = 0;
      clock.hours++;
      if (clock.hours >=24) {
        clock.hours = 0;
        clock.days++;
      }       
    }
  }    
}



function showClock(){

//prints clock in format yyyy/mm/dd hh:mm:ss

}

这将相应地增加秒、分钟、小时和天...

因此,如果我每秒调用 print 时钟,它将如下所示:

var c = new Clock(2014,04,01,12,13,01);

showClock();

2014/4/1 12:13:1

我被困在月份部分......

我的问题是,由于每个月的天数不同,我该如何检查一个月是否已过?

编辑

我正在创建自己的缩小日期函数...所以请不要推荐使用 Date 对象,因为我正在尝试实现自己的对象

【问题讨论】:

  • (嘘——你应该检查undefined而不是null。如果没有传递参数值,它将是undefined.)

标签: javascript clock


【解决方案1】:

这就是你要找的吗?

function incrementClock(){
  clock.seconds++;
  if (clock.seconds >=60) {
    clock.seconds = 0;
    clock.minutes++;
    if (clock.minutes >=60) {
      clock.minutes = 0;
      clock.hours++;
      if (clock.hours >=24) {
        clock.hours = 0;
        clock.days++;
        var months = [31,((clock.year%4==0)&&((clock.year%100!=0)||(clock.year%400==0)))?29:28,31,30,31,30,31,31,30,31,30,31];
        if (clock.days>months[clock.month-1]){
          clock.days = 0;
          clock.months++;
        }
      }       
    }
  }    
}

这一行:

var months = [31,((clock.year%4==0)&&((clock.year%100!=0)||(clock.year%400==0)))?29:28,31,30,31,30,31,31,30,31,30,31];

创建一个包含月份和每个月的日期的数组。因此很容易确定每月的天数,如下所示:

days_in_jan = months[0]
days_in_feb = months[1]
...
days_in_dec = months[11]

【讨论】:

  • if (clock.days>months[clock.month-1]){ 究竟做了什么?特别是month-1 部分
  • 判断当天是否超过了当月的天数。当前月份的天数是这样的:“months[clock.month-1]”。假设 1 月是第 1 个月。如果是 0,则使用 "months[clock.month]" 代替。
  • 是的,但我还是不明白-1 是干什么用的?
  • 这取决于你如何存储clock.month。如果 1 被认为是 1 月,那么月份中的第 0 个内存槽对应于 1 月,因此您减去 1。但是,如果您考虑 1 月 0 日,则可以删除 -1。
  • 太棒了!现在是否完全回答了您的问题?
【解决方案2】:

你没有。你实际上并没有增加任何东西。如果你想要自己的时钟,那很好,但你仍然需要使用Date 对象来访问当前时间,所以当你想知道已经过去了多少时间时,获取一个新的Date 对象并计算出来:

伪结构:

Class Clock
    - start date

    - function timeElapsed
        - elapsed = now - start date

在该函数中,比较月份、日期等。

老实说,如果您不喜欢这个答案,那您只能靠自己了,因为“我如何将这个随机的事情作为纯粹的思考练习”的答案正是——思考练习。它没有真正的意义,因此不应该在 SO 上问或回答。

【讨论】:

  • 我可以随意问任何我想问的问题……这有一点。我正在学习如何用 JavaScript 编写代码,我发现这类任务很有趣。哦,这不是“我如何做这个纯粹的思想练习”,我有一个问题,这就是 Stackoverflow 的用途......
  • 虽然我大体上同意你的观点,但我觉得你在贬低“真正的”解决方案,而倾向于以你自己特定的错误方式去做。这对于思维练习来说很好,我通常鼓励它,尤其是学习一门语言。但是这种类型的问题对其他人来说完全没用,所以我觉得它应该远离 SO。就像我去一个建筑论坛问“我怎么用回形针盖房子?”这可能是一个有趣的挑战,但它真的只对提出问题的人感兴趣,并没有真正的目的。
【解决方案3】:

正如其他人所做的那样,我建议使用 Date 对象或 MomentJS 之类的日期库,但您似乎想自己进行实现作为练习。在这种情况下,如果要正确进行计算,您的代码将需要知道每个月有多少天。考虑在您的代码中包含月份长度的数组:

var monthLengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

您还需要一个函数来确定是否是闰年:

function isLeapYear(year) {
  return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}  

有了这些,您应该能够通过检查数组以了解该月有多少天,并且(如果是二月)使用闰年函数来确定您是否应该判断某个日期是否超过其月份算一算二月的 29 天。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2011-06-20
    • 2019-01-03
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多