【问题标题】:JavaScript Addition Date FunctionsJavaScript 添加日期函数
【发布时间】:2012-01-01 07:22:41
【问题描述】:

我对核心 JavaScript 了解不多,只知道一点 jQuery。但我知道 jQuery 对于我在这里需要的东西不是必需的:

我想使用 getdate 函数找出服务器的星期几。然后添加一堆像这样的子句:

  • 如果是星期一,则将日期加 6,并以 MM/DD/YYYY 形式返回日期。
  • 如果是星期二,则将日期加 5 并以 MM/DD/YYYY 形式返回日期。
  • 如果是星期三,则将日期加 4 并以 MM/DD/YYYY 形式返回日期。

以此类推,直到周日它会加 0。

假设今天是星期一,它将在 2012 年 1 月 8 日返回 而在今天的星期天的实际日期,所以它真的会返回 2012 年 1 月 1 日

然后我只想调用document.write 函数将它返回的 MM/DD/YYYY 写入我的 HTML 文档中。

有人可以帮助我吗?如果您需要我,我可以澄清一下...

【问题讨论】:

  • 您无法从 JavaScript 中找到服务器的星期几,只能找到客户端的星期几(即使这样,也只能找到用户设置的系统日期)。至于 JavaScript 日期操作,请阅读 the doco at MDN - 所有日期方法都列出了一些示例。另外,如果您的要求是 MM/DD/YYYY 格式,为什么您的示例日期是 M/D/YYYY 格式?

标签: javascript add document.write getdate


【解决方案1】:

getDay() 返回星期几,星期日 = 0,星期一 = 1,等等。

所以说今天是星期一 getDay() 将返回 1,这意味着 daysToAdd 将是 5。

一旦我们知道要添加多少天,我们就可以创建一个新日期并添加这些天。为此,我们以毫秒为单位获取今天,然后以毫秒为单位添加天数 (daysToAdd)。

我们通过乘以 24*60*60*1000(即一天中的毫秒数)将天转换为毫秒。

我给月份加了 1,因为 JavaScript 返回基于 0 的月份,但为了显示的目的,我们想要格式化它,例如一月是 1 而不是零。

function getEndOfWeek() {
    var today = new Date();
    var weekDay = today.getDay();
    // if you want the week to start on Monday instead of Sunday uncomment the code below
    //weekDay -= 1;
    //if(weekDay < 0) {
    //    weekDay += 7;
    //}
    var daysToAdd = 6 - weekDay;
    var newDate = new Date(today.getTime() + daysToAdd *24*60*60*1000);
    var month = newDate.getMonth() + 1;
    var day = newDate.getDate();
    var year = newDate.getFullYear();
    var formatedDate = month + "/" + day + "/" + year;
    return formatedDate;
}

您可以像这样在代码中实现 JavaScript:

$(function() {
    $("#TheDate").html(getEndOfWeek());
});

你的 HTML 应该是这样的:

The week ends on <span id="TheDate"></span>.

你可以在这里找到 jsFiddle:jsFiddle

如果您想调整工作日以便将星期一而不是星期日视为一周的开始,您可以在获得工作日后执行以下操作:

weekDay -= 1;
if(weekDay < 0) {
    weekDay += 7;
}

【讨论】:

  • 我不想在日期上添加 6 天,我只想在星期一添加 6 天,星期二添加 5 天,星期三添加 4 天,一直到星期日添加 0 天...
  • 嘿@user1090389 这就是它的实际作用。 getDay() 实际上返回工作日而不是当月的实际日期,getDate() 返回当月的日期。我应该解释一下,连同我的答案,我现在会更新我的答案。
  • 如何在我的文档中实现这一点?
  • 嘿@user1090389,我添加了您要求的其他详细信息。
  • 太棒了,几乎是完美的,只是我不想让这周在周六结束,我希望它在周日结束,我该怎么做?
【解决方案2】:
var day = 1000*60*60*24
, nextSunday = new Date(+new Date() + day*(7-((0|(+new Date()/day)%7-3)||7)));

alert(
    (101+nextSunday.getMonth()).toString().substr(1) + '/' +
    (100+nextSunday.getDate()).toString().substr(1) + '/' +
    nextSunday.getFullYear()
)

【讨论】:

  • 这只适用于周日到周三。在星期四和星期五,它会在 14 日星期六返回。星期六它返回星期六 7th...
【解决方案3】:

我认为,与在 JavaScipt 中添加日期一样,我的“DateExtensions”库做得很好。你可以在这里得到它:

http://depressedpress.com/javascript-extensions/dp_dateextensions/

一旦引用,您可以调用“add()”作为任何有效日期的方法,并将许多日期部分(秒、分钟、天、小时等)中的任何一个传递给它。因此,假设“curDate”是一个有效的 JavaScript 日期对象,您可以像这样添加 5 天:

newDate = curDate.add(5, "days");

使用负值会减去:

newDate = curDate.add(-5, "days");

一旦你得到你想要的日期,你就可以使用库的 dateFormat() 方法来显示它,如下所示:

curDate.dateFormat("MM/DD/YYYY");

链接中有完整的文档。

星期几的整数值

至于获得你想要的整数值,它实际上看起来更容易(而且你不需要“如果”只是一些数学)。日期的 getDay() 方法返回星期几,星期日为“0”,星期六为“6”。因此,从星期日开始的一周通常是:

0,1,2,3,4,5,6

首先,您要反转该比例。这很容易通过减法来完成,方法是从值中取 7(到集合的成员总数)。这给了你这个规模:

-7,-6,-5,-4,-3,-2,-1

我们越来越近了。您也希望第一个值为零。最简单的方法(我认为)是通过成员总数获取值的模数(余数)。所有这一切基本上就是将“-7”设为零,剩下的就不用管了:

0,-6,-5,-4,-3,-2,-1

快完成了。最后,您不想要负数,因此您需要使用 Math.abs() 方法来消除符号(获取绝对值),从而得到我们想要的结果:

0,6,5,4,3,2,1

对于所有的谈话,实际代码非常紧凑:

数学.abs((cnt-7)%7)

将其包装到原始示例中可以得到:

newDate = curDate.add(Math.abs((curDate.getDay()-7)%7), "days");

服务器与客户端

不过,请记住 nnnnnn 的评论:在 JavaScript 中,getDate() 函数获取运行它的机器的当前日期/时间 - 在网页是客户端而不是服务器的情况下。

如果您实际上是指客户时间,那么您已经设置并完成了。如果您真的需要服务器时间,那么这很烦人,甚至是不可能的。如果您拥有服务器,那么实际上不难设置一个规则,将当前服务器包含在每个已完成请求的 cookie 中(然后您可以使用我的 cookie 库,也在上面的站点上,访问信息!)

这比较麻烦,但根据服务器的不同,您可能还可以创建一个老式的服务器端包含,为每个页面添加一些 JavaScript(最好作为标头中的标记替换),对日期进行硬编码作为一个全局变量。

您还可以创建一个 Web 服务,它返回当前服务器时间,但与正在传递的数据相比,客户端开销是疯狂的。

如果服务器不是您的(并且您无法让所有者提供上述内容),那么唯一真正可能的选择是直接进行 http 调用并检查 HTTP“日期”标头。然而,与回报相比,这方面的开销也是巨大的,但这确实是唯一的方法。任何像这样的系统都必须非常灵活,但是因为任何特定的服务器可能不会返回日期标头或可能无法正确返回它。

即使它确实有效,您也可能无法获得“服务器”时间 - 或者至少不是您想要的服务器。例如,在分层架构中,应用程序服务器可能会渲染页面并将其交给 Web 服务器以返回 - 您将获得 Web 服务器时间,而不是应用程序服务器。任意数量的设备也可能会重写标头(例如,通常使用专用的 SSL 设备来卸载所有加密工作 - 这些通常会自己重写标头)。

抱歉,技术性太强了——JavaScript 无疑是一个很遗憾很少有“简单问题”的领域。 ;^)

祝你好运!

【讨论】:

  • 我在原始答案中添加了有关如何使用您的规则将日期作为整数获取的信息。希望对您有所帮助。
猜你喜欢
  • 2011-02-11
  • 2023-03-08
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多