【问题标题】:Converts minutes into days, week, months and years将分钟转换为天、周、月和年
【发布时间】:2011-10-18 19:45:11
【问题描述】:

假设我有一个数字,表示从开始时间到现在所经过的分钟数。

我想创建一个函数,它返回与我传递给该函数的分钟对应的年、月、周和日。

这里是一个例子:

var minutes = 635052; // 635052 = (24*60)*365 + (24*60)*30*2 + (24*60)*14 + (24*60)*2 + 12;
getDataHR(minutes); // 1 year, 2 months, 2 week, 2 days, 12 minutes

function getDataHR (newMinutes) {
      minutes = newMinutes;
      .......
      return hrData; // 1 year, 2 months, 2 week, 2 days, 12 minutes
}

实现结果的最佳方法是什么?

【问题讨论】:

  • 你是否使用了 0 分钟的参考日期?计算正确的月份长度可能需要它。
  • 是的,0 分钟的参考是当前日期。所以var minutes = 2; 表示从现在开始 2 分钟。
  • 您必须更加精确才能得到一个体面的答案。 “月、周和日”是什么意思?今天是 10 月 18 日。从现在到 11 月 29 日的同一时间(距今 35 天)有多少个月、几周和几天?今天晚上 11:59 到明天凌晨 12:01 之间有多少天?零?一个?
  • 使用 JavaScript 原生 Date 对象。

标签: javascript


【解决方案1】:

可能是这样的?

var units = {
    "year": 24*60*365,
    "month": 24*60*30,
    "week": 24*60*7,
    "day": 24*60,
    "minute": 1
}

var result = []

for(var name in units) {
  var p =  Math.floor(value/units[name]);
  if(p == 1) result.push(p + " " + name);
  if(p >= 2) result.push(p + " " + name + "s");
  value %= units[name]

}

【讨论】:

  • 什么...大约...小时? :P
【解决方案2】:

thg435's response above 的基础上,我创建了一个将秒转换为天、小时、分钟和秒的函数:

function secondsToString(seconds)
{
   var value = seconds;

   var units = {
       "day": 24*60*60,
       "hour": 60*60,
       "minute": 60,
       "second": 1
   }

   var result = []

   for(var name in units) {
     var p =  Math.floor(value/units[name]);
     if(p == 1) result.push(" " + p + " " + name);
     if(p >= 2) result.push(" " + p + " " + name + "s");
     value %= units[name]
   }

   return result;

}

我还在结果中添加了一些空格,以便为逗号留出一些空间。输出如下:

1 day, 3 hours, 52 minutes, 7 seconds.

【讨论】:

    【解决方案3】:

    我是这样做的,因为我什至不知道javascript中有一个模运算符:

    var minutes = 635052; // 635052 = (24*60)*365 + (24*60)*30*2 + (24*60)*14 + (24*60)*2 + 12;
    getDataHR(minutes); // 1 year, 2 months, 2 week, 2 days, 12 minutes
    
    function getDataHR (newMinutes) {
        MINS_PER_YEAR = 24 * 365 * 60
        MINS_PER_MONTH = 24 * 30 * 60
        MINS_PER_WEEK = 24 * 7 * 60
        MINS_PER_DAY = 24 * 60
        minutes = newMinutes;
        years = Math.floor(minutes / MINS_PER_YEAR)
        minutes = minutes - years * MINS_PER_YEAR
        months = Math.floor(minutes / MINS_PER_MONTH)
        minutes = minutes - months * MINS_PER_MONTH
        weeks = Math.floor(minutes / MINS_PER_WEEK)
        minutes = minutes - weeks * MINS_PER_WEEK
        days = Math.floor(minutes / MINS_PER_DAY)
        minutes = minutes - days * MINS_PER_DAY
        return years + " year(s) " + months + " month(s) " + weeks + " week(s) " + days + " day(s) " + minutes + " minute(s)"
        //return hrData; // 1 year, 2 months, 2 week, 2 days, 12 minutes
    }
    

    【讨论】:

      【解决方案4】:

      你需要使用除法和模数:

      function getDataHR (newMinutes) {
          var hrData = "";
      
          var years = minutes / YEAR_IN_MINUTES; // int division = no remainder
          hrData += years + "years";
          minutes = minutes % YEAR_IN_MINUTES;
      
          // ... continue for months, weeks, days, hours, etc. in that order
      
          return hrData; // 1 year, 2 months, 2 week, 2 days, 12 minutes
      }
      

      【讨论】:

      • 为什么是int除法而不是float?
      • 在 javascript 中它可能会变成一个浮点数。所以你可以用Math.floor(...)包围它来四舍五入。
      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多