Javascript 如何将公历日转换为公历日

Javascript 如何将公历日转换为公历日,javascript,datetime,django-templates,erlang,Javascript,Datetime,Django Templates,Erlang,我将公历日和一些其他数据存储在表中。 这些天我通过以下Erlang命令获得: {Date, _} = calendar:now_to_datetime(now()). GDays = calendar:date_to_gregorian_days(Date). 让我们以这个值为例:GDays=736202 我已经建立了一个网站在牛仔与ErlyDTL为我的意见。 现在我想以日期格式呈现这些公历日。(2015年8月28日) 我使用以下代码从视图中的列表中获取数据: {% for item in l

我将公历日和一些其他数据存储在表中。 这些天我通过以下Erlang命令获得:

{Date, _} = calendar:now_to_datetime(now()).
GDays = calendar:date_to_gregorian_days(Date).
让我们以这个值为例:GDays=736202

我已经建立了一个网站在牛仔与ErlyDTL为我的意见。 现在我想以日期格式呈现这些公历日。(2015年8月28日)

我使用以下代码从视图中的列表中获取数据:

{% for item in list %}
  {{item.1}} <br/>
{% endfor %}
{%用于列表%中的项目]
{{item.1}}
{%endfor%}
我尝试了以下命令
{{item.1 | date:“dd M Y”}
,但出现了一个错误:

意外日期参数:736202

现在,我如何用erlyDTL或javascript将这个公历日转换为datetime


提前感谢

根据此处的文档:

Erlang将公历日基于1月1日0,并提供了一个示例:1970年1月1日是719528。所以纪元是第0天

以下函数将日期对象转换为公历日并返回。它们根据文档中的单个示例返回正确的值,但将736202转换为2015年8月27日而不是8月28日。也许您使用的是UTC而不是本地时间。不管怎么说,我想这里有足够的东西让你解决

/*@param{Date}[Date]-要转换的日期对象
**@returns{number}-自1月1日起0至d的整天
**
**在许多实现中,纪元日期必须单独设置年份
**新日期(0,0,1)返回1900年1月1日,而不是0000年1月1日
*/
函数dateToGregorianDays(日期){
//为0000-Jan-01创建日期对象(月份以零为基础)
var历元=新日期(0,0,1);
//将历元设置为0年,如上面所述,某些浏览器将
//创建1900而不是0的日期,即使传入了0
纪元整年(0);
//复制传入日期,以便下一步不会修改它
var e=新日期(+日期);
//将复制日期的时间部分设置为00:00:00,这将
//有助于计算整个天数
e、 设定小时数(0,0,0,0);
//在数学运算中,日期被转换为它们的时间值
//也就是毫秒,所以得到两者之间的毫秒差
//这两个日期除以毫秒/天。舍入以删除
//部分零件偶尔会在夏令时边界上产生
//获取两个日期之间的全天计数并返回
返回数学圆((e-epoch)/8.64e7);
}
/*@param{number}[days]-公历日数
**@returns{Date}-基于自0年1月1日起的整天
**
**0->10000年1月1日
**719528->1970年1月1日
*/
函数gregorianDaysToDate(天){
//为0000-Jan-01创建日期
var历元=新日期(0,0,1);
纪元整年(0);
//将天数添加到日期
//epoch.getDate()可以替换为1,因为
//日期设置为略高于
epoch.setDate(epoch.getDate()+天);
//返回日期
回归期;
}
/*返回日期字符串为dd MMM yyyy的简单函数
**@param{Date}[Date]-要格式化的日期
**@返回日期的{string}格式字符串
*/
函数formatDateDMY(日期){
//月份名称
变量月数=['一月','二月','三月','四月','五月','六月',
‘七月’、‘八月’、‘九月’、‘十月’、‘十一月’、‘十二月’;
//将前导零添加到一位数天数
//获取月份的月份名称(零索引,0为一月)
//将前导零添加到少于4位的年份
//使用“-”作为分隔符
return('0'+date.getDate()).slice(-2)+'-'+
月[date.getMonth()]+'-'+
('000'+date.getFullYear()).slice(-4);
}
//为上述函数创建别名以保存键入
var fd=formattedmy;
//1970年1月1日的公历日
文件。写入(日期注册日期(新日期(1970,0,1))+“
”;//719528 //719528的公历日期格式为dd MMM yyyy 文件写入(fd(gregorianDaysToDate(719528))+“
”)//1970年1月1日 //0的公历日期格式为dd MMM yyyy document.write(fd(gregorianDaysToDate(0))+“
”);//0000年1月1日 //736202的公历日期格式为dd MMM yyyy 文件。写入(fd(gregorianDaysToDate(736202))+“
”;//2015年8月27日 //2015年8月28日的公历日
文件。书写(日期登记日期(新日期(2015,7,28));//736203
这是我需要的算法。我用javascript以一种非常简单的方式制作了它,现在已经足够好了,所以不要挑剔;)。 没有人支持闰年

<html>
  <head>
    <script>
      function date(n){
        // Calculate the year.
        var year = Math.round(n / 365.2425 - 0.5);
        // Get the remainder of the year calculation.
        var dec = Math.round(((n * 10000) / 365.2425) - (year * 10000));
        // Multiply remainder with 365.2425.
        var day = Math.round((dec * 365.25) / 10000);
        // Search which month and day it is.
        if(day <= 30){
          return day.toString().concat(" januari ").concat(year);
        }else if(day <= 58){
          return (day - 30).toString().concat(" februari ").concat(year.toString());
        }else if(day <= 89){
          return (day - 58).toString().concat(" maart ").concat(year.toString());
        }else if(day <= 119){
          return (day - 89).toString().concat(" april ").concat(year.toString());
        }else if(day <= 150){
          return (day - 119).toString().concat(" mei ").concat(year.toString());
        }else if(day <= 180){
          return (day - 150).toString().concat(" juni ").concat(year.toString());
        }else if(day <= 211){
          return (day - 180).toString().concat(" juli ").concat(year.toString());
        }else if(day <= 242){
          return (day - 211).toString().concat(" augustus ").concat(year.toString());
        }else if(day <= 272){
          return (day - 242).toString().concat(" september ").concat(year.toString());
        }else if(day <= 303){
          return (day - 272).toString().concat(" oktober ").concat(year.toString());
        }else if(day <= 333){
          return (day - 303).toString().concat(" november ").concat(year.toString());
        }else if(day <= 364){
          return (day - 333).toString().concat(" december ").concat(year.toString());
        }else{
          return "error";
        }
      }
    </script>
  </head>
  <body>
    <script>
      document.write(date(736205));
    </script>
  </body>
</html>

功能日期(n){
//计算年份。
变量年=数学四舍五入(n/365.2425-0.5);
//获取年度剩余时间的计算结果。
var dec=数学四舍五入((n*10000)/365.2425)-(年份*10000));
//将余数乘以365.2425。
var日=数学整轮((12月*365.25)/10000);
//搜索当前的月份和日期。

if(day)此处有关于计算公历日期的信息:。如果您需要实现算法的帮助,请询问。一旦您有了日期对象,这里有许多关于如何格式化它的问题。如何以相反的方式执行此操作,并且从第0年(公历)开始计算天数.我有你参考资料中计算的天数。现在我想把这个数字计算回一个日期戳。当我做736202/365.25时,我得到了2015.6112251882273。现在我被卡住了,因为我不知道如何从中得到月和日。公历日的纪元应该是1582年10月15日。再加上736202天,就得到了3598年6月10日。如果使用0001年1月1日的历元,则将得到2016年8月27日。如果从0年开始,则减去一年(这没有实际意义)。大多数地方都警告不要在公历开始之前计算公历日期,尽管我想你可以使用任何你喜欢的历元。我不懂这个数学,因为公历从1月1日0000开始。Erlang给了我(参见上面的命令)从1月1日起的天数。我想你说的是