Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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
Javascript 计算当前时间相对于日出和日落时间的百分比?_Javascript_Api_Momentjs - Fatal编程技术网

Javascript 计算当前时间相对于日出和日落时间的百分比?

Javascript 计算当前时间相对于日出和日落时间的百分比?,javascript,api,momentjs,Javascript,Api,Momentjs,我想我想要实现的目标可以用下面的图表来描述: 我从API获取日出和日落数据,该API返回如下对象: { sunrise: "07:58:38", sunset: "15:52:46", day_length: "07:54:08", } 我目前正在使用以下if语句计算当前是白天还是夜间: const date = moment().format("YYYY-MM-DD") let dayOrNigh

我想我想要实现的目标可以用下面的图表来描述:

我从API获取日出和日落数据,该API返回如下对象:

{
  sunrise: "07:58:38",
  sunset: "15:52:46",
  day_length: "07:54:08",
}
我目前正在使用以下if语句计算当前是白天还是夜间:

const date = moment().format("YYYY-MM-DD")

let dayOrNight = "Day"

if (moment().isAfter(`${date} ${location.sunrise}`) && moment().isBefore(`${date} ${location.sunset}`)) {
  dayOrNight = "Day"
} else {
  dayOrNight = "Night"
}
我所需要的是一个基于当前时间的百分比值,与日出和日落数据相关

例如,如果这是我的数据集:

{
  sunrise: "00:00:00",
  sunset: "10:00:00",
}
我的当前时间正好介于日出和日落之间,在这种情况下,我的当前时间将是
05:00:00
17:00:00
,那么我的当前时间将等于100%<代码>02:30:00,
07:30:00
等于50%。

嗨, 解决方案 我认为用秒来工作是合乎逻辑的

  • 找到白天中点和夜晚中点的时间。(日间中点秒+12 x 60 x 60秒为夜间中点)
  • 查找白天和黑夜的每秒百分比(白天=>
    (白天中点秒-日出秒)/100
  • 确定给定的时间是否为白天/晚上。(你已经解决了)
  • 如果是白天,则设置
    已用秒=给定秒-日出秒
  • 如果给定时间>天的中点,百分比为
    200-(已用秒x每秒百分比)
  • else百分比是
    已用秒x每秒百分比
同样,你也可以轻松地在夜间锻炼

或 经过再三思考和对图表的检查

  • 找到与日出有关的一切。(白天、中点和日落)
  • 根据给定的时间(以秒为单位)的位置(好的旧
    y=mx+c
    )应用公式以获得百分比
我们将得到4个方程:-

y = (100x)/day_midpoint_in_sec
y = (-100x/(sunset_in_sec - day_midpoint_in_sec)) + 100
y = 100x/(night_midpoint_in_sec - sunset)
y = (-100x/(24*60*60 - sunset_in_sec) - sunset_in_sec) + 100
编辑 您好,由于第二个解决方案变得更加复杂(我也注意到了我的部分中的一些边缘情况和错误),我在第一个解决方案的基础上制作了一个工作片段


let api = {
  sunrise: "00:00:00",
  sunset: "10:00:00",
};


const date = moment().format("YYYY-MM-DD")

let sunrise = moment(`${date} ${api.sunrise}`);
let sunset = moment(`${date} ${api.sunset}`);
let hour_24 = moment(`${date} 24:00:00`);
let hour_0 = moment(`${date} 00:00:00`);

let sunset_till_hour24 = hour_24.clone().subtract(sunset);
let hour24_till_sunrise = sunrise.clone().subtract(hour_0);

let midnight = sunset.clone().add(sunset_till_hour24.clone().add(hour24_till_sunrise).valueOf()/2);
let midday = sunrise.clone().add(sunset.clone().subtract(sunrise).valueOf()/2);



let givenTime = "17:10:00";
let given_time = moment(`${date} ${givenTime}`);


function findTimePercent(time, sunrise, midday, sunset, midnight) {
  let day_percent_per_ms = 100/midday.clone().subtract(sunrise).valueOf();
  let night_percent_per_ms = 100/midnight.clone().subtract(sunset).valueOf();
 

  let percent = 0;

  if (time.isSame(sunrise) || time.isSame(sunset)) {
    return 0;
  } else if (time.isSame(midday) || time.isSame(midnight)) {
    return 100;
  }
  
  // isBetween is exclusive
  if (time.isBetween(sunrise, midday)) {
      percent = time.subtract(sunrise).valueOf() * day_percent_per_ms;
  } else if(time.isBetween(midday, sunset)) {
      percent = 100 - (time.subtract(midday).valueOf() * day_percent_per_ms);
  } else if(time.isBetween(sunset, midnight)) {
      percent = time.subtract(sunset).valueOf() * night_percent_per_ms;
  } else {
      percent = 100 - (time.subtract(midnight).valueOf() * night_percent_per_ms);
  }
  
  return percent;

}


console.log(findTimePercent(given_time, sunrise, midday, sunset, midnight));


我希望这是不言自明的。

你能详细说明最后四个方程式吗?显然,如果我将它们粘贴到JS文档中,语法将是错误的。请随时与我在这里开始一对一的房间,我们可以讨论通过!如果您需要任何澄清,请告诉我。搞定!非常感谢。如果100%为正午和午夜,并且每天和夜晚的开始和结束为0%,我们如何添加第二个百分比值?有没有任何方法可以获得给定时间、正午、午夜、日出和日落的值