如何仅根据当地日期/时间获取当前的日光量? (像助焊剂一样)

时间:2014-04-14 20:22:14

标签: javascript datetime dst flux

我的计划是根据当前的当地时间(来自javascript)对网页进行微调。我不需要像当前流明或任何东西那样特定的东西,但我想获得高峰日照,日出,日落和午夜+大约-2小时左右的大致时间。我意识到基于纬度和纬度的确切时间会有很大差异。我可以访问的经度和时区数据。但首先,我想知道是否只有像[北半球]和当地时间这样的公式。

f.lux如何做到这一点?

更新1:我的大多数搜索都刚刚返回夏令时相关信息,这不是很有帮助。我确实找到了这个JS:http://www.esrl.noaa.gov/gmd/grad/solcalc/main.js(来自这里http://www.esrl.noaa.gov/gmd/grad/solcalc/)但它充满了无法解释的魔法常数。例如:

function calcGeomMeanLongSun(t)
{
  var L0 = 280.46646 + t * (36000.76983 + t*(0.0003032))
  while(L0 > 360.0)
  {
    L0 -= 360.0
  }
  while(L0 < 0.0)
  {
    L0 += 360.0
  }
  return L0     // in degrees
}

function calcGeomMeanAnomalySun(t)
{
  var M = 357.52911 + t * (35999.05029 - 0.0001537 * t);
  return M;     // in degrees
}

function calcEccentricityEarthOrbit(t)
{
  var e = 0.016708634 - t * (0.000042037 + 0.0000001267 * t);
  return e;     // unitless
}

更新2:我认为通过gps或其他任何方式确定用户区域设置的“成本”太大了(特别是因为这纯粹是出于美观的原因而没有其他功能用途),所以我可能只会坚持上午12点至下午6点至下午6点的周期,无论当地时间是通过javascript。

更新3:我刚刚接受了略微修改的正弦波,并且偏向白天:

  var x, fx, hour,
  // starting hsl value for midnight:
      h = 220, 
      s = 42, 
      l = 75;

  for (hour = 0; hour < 24; hour++) {
    // 0 for midnight, up to 12 for noon
    x = 12 - Math.abs(hour - 12);

    // 0.0 to 1.0
    fx = x / 12;
    // factor of pi, shift x axis by 1 half pi
    fx = (Math.PI * (fx - (1 / 2)));
    // sine function
    fx = Math.sin(fx);
    // +1 to start at 0, take half to max out at one
    fx = (fx + 1) / 2;
    // skew the values just slightly for daytime
    fx = Math.pow(fx, 0.75);
    // change range back to top out at 12
    fx = fx * 12;

    // base of 220 degrees, 18.25 provided a nice color rage from bluish to yellowish
    h = Math.floor((220 + (18.25 * fx)));
    // rotate on 360 degrees
    while (h >= 360) { 
      h = h - 360; 
    }

    // base of 42% saturated, multiplied x for a linear slope up to 100%
    s = Math.floor(42 + (5.5 * x));
    // 100 max
    if (s > 100) {
      s = 100; 
    }

    // base of 75% lightness, 1.85 factor was a nice linear slope stopping short of 100%
    l = Math.floor(75 + (1.85 * x));
    // 100 max
    if (l > 100) {
      l = 100; 
    }


    // "style='background-color: hsl(" + h + ", " + s + "%, " + l + "%);'"
  }

Here it is on JSBin。我可能会在未来获得实际金额,但这让我现在足够接近。

1 个答案:

答案 0 :(得分:0)

维基百科的这个等式是不够的:

http://en.wikipedia.org/wiki/Sunrise_equation

它没有任何魔力,只是一点数学。

或者你还需要更多东西吗?