在 JavaScript 中计算日期

Posted

技术标签:

【中文标题】在 JavaScript 中计算日期【英文标题】:Calculating Date in JavaScript 【发布时间】:2011-06-16 06:39:43 【问题描述】:

我目前正在寻找在 javascript 中计算一个自定义日期,我的头开始受伤了。我有一个倒计时时钟,每隔一个星期二中午 12 点开始。我使用 Keith Wood 的 jQuery 倒计时插件使倒计时功能正常工作,但需要帮助计算每月的每隔一个星期二并在这一天重置它。

一如既往地感谢所有帮助。

提前致谢

【问题讨论】:

你目前有什么代码? .getDay() 函数可能会有所帮助:w3schools.com/js/js_obj_date.asp hi jnolte :) 请尝试发布您的一些代码,这可能有助于我们更快地解决您的问题。天呐! :) 另外,58% 的接受并不是那么好...... 你的意思是说在日期Jan/1/11Jan/10/11 23:59:59 它会显示秒到Jan/11/11 0:0:0,从那时起它会显示秒到Jan/25/11 0:0:0?如果是这样,Jan/25/11 0:0:0 之后会发生什么? 【参考方案1】:

请找到Date Library的附加链接以获取自定义计算日期和时间函数。

要在客户端使用它,请下载 index.js 和 assertHelper.js 并将其包含在您的 html 中。

<script src="assertHelper.js"></script>
<script type="text/javascript" src="index.js"></script>
$( document ).ready(function() 
    DateLibrary.getDayOfWeek(new Date("2015-06-15"),operationType:"Day_of_Week"); // Output : Monday

您可以使用示例中给出的不同函数来获取自定义日期。

从给定日期获取季度的第一天

DateLibrary.getRelativeDate(new Date("2015-06-15"),
    operationType:"First_Date",granularityType:"Quarters") // Output : Wed Apr 01 2015 00:00:00

如果一周的第一天是星期日,那么星期三是哪一天,如果 给定日期是 2015 年 6 月 15 日

DateLibrary.getRelativeDate(iDate,
    operationType: "Date_of_Weekday_in_Week",
        startDayOfWeek:"Sunday",returnDayOfWeek:"Wednesday") // Output : Wed Jun 17 2015 00:00:00

如果一周的第一天是星期五,那么第三天星期二是哪一天 包含 2015 年 6 月 15 日的一年第三季度第二个月的一周 日期之一。

DateLibrary.getRelativeDate(new Date("2015-06-15"),
    operationType: "Date_of_Weekday_in_Year_for_Given_Quarter_and_Month_and_Week",
        startDayOfWeek:"Friday",returnDayOfWeek:"Tuesday", QuarterOfYear:3, MonthOfQuarter:2, WeekOfMonth:3) // Output : 18th Aug 2015

如果一周的第一天是星期二,那么一年中的第几周将是 按照 2015 年 6 月 15 日作为日期之一。

 DateLibrary.getWeekNumber(new Date("2015-06-15"),
    operationType:"Week_of_Year",
        startDayOfWeek:"Tuesday") // Output : 24

还有日期差功能可用

 DateLibrary.getDateDifference(new Date("2016-04-01"),new Date("2016-04-16"),
    granularityType: "days") //output 15

数字转Timestr函数

DateLibrary.getNumberToTimeStr("345", delimiter: ":") //output 00:03:45

它还支持儒略日期转换

 DateLibrary.julianToDate("102536") //output Fri Jun 20 2003 00:00:00

【讨论】:

【参考方案2】:

我不得不做一些类似的事情(不是在 JS 中,但算法足够相似)

现在,在我开始之前,澄清一下,我假设这是每两周发生一次的事情,无论月份长短如何,不是第二个和第四个星期二,无论上次发生的时间,解决起来比较简单

选择过去发生此事件的日期(或第一次发生的日期),我们将在以下代码中将此日期称为base

var base=new Date('date of first occurrence');
var one_day=1000*60*60*24; //length of day in ms

// assume we care about if the countdown should start today 
// this may be different if you are building a calendar etc.
var date_to_check=new Date();

var diff_in_days=math.floor(date_to_check-base)/one_day);
var days_since_last_reset= diff_in_days%14;
if(days_since_last_reset == 0)
    //date_to_check is the same day in the fortnightly cycle as base
    //i.e. today at some point is when you'll want to show the timer
    //If you only want to show the timer between certain times,
    //add another check here
else
    //next reset in (14 - days_since_last_reset) days from date_to_check

或者代码高尔夫风格的版本:

if( Math.floor((new Date()-new Date('date of first occurrence'))/1000/60/60/24)%14 == 0 )
    //reset/start timer

【讨论】:

感谢 Toby,虽然还没有完全解决,但这正是我们想要的。再次感谢!【参考方案3】:

看看date.js 库。它有几个日期解析助手,包括Date.today().next().tuesday()(等等)。

【讨论】:

如何准确地使用它来确定日期 X 是否是固定日期两周的倍数? 没有明显的对重复的支持(至少在文档中),这使得它对这个问题毫无用处【参考方案4】:

有一个 RFC 2445 重复规则的 JavaScript 实现:http://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/demos/calendar/rrule-cajita.js,它需要同一目录中的一些文件。有关其工作原理的示例,请参阅单元测试 (http://code.google.com/p/google-caja/source/browse/trunk/tests/com/google/caja/demos/calendar/rrule_test.js)。

尝试使用它来解析 RRULE:FREQ=WEEKLY;BYDAY=TU;INTERVAL=2 这意味着每秒(因为间隔)每周(因为频率)星期二(因为白天)。

【讨论】:

太棒了,我没有 RFC 重复的经验,你如何指定开始日期?在我看来,英文描述描述了 2 种不同的重复出现 - 一种包括 2011-01-04,另一种包括 2011-01-11 开始日期是在单元测试的第 47 行传递给 rrule.createRecurrenceIterator(new StubContentLine(rruleText), dtStart, tz)dtStart。可以使用日期格式 (time.parseIcal("20060120")) 或日期时间格式 (time.parseIcal("20060120T123000")) 指定它。如果您只想指定 2 次重复,则使用 ;COUNT=2 指定,而不是 ;INTERVAL=2 两个事件!= 两次重复 - 我的意思是它指定了两个不同的序列,并且根据您的最后评论,这些序列之间的区别是在构造迭代器时进行的,而不是在规范中本身... 对不起。也许我不明白。在“每个月的每个星期二”中,我假设您的意思是从特定的星期二开始每两周一次。不是这样吗?我链接到的代码确实允许多次重复。只需传入 2 个或更多 RRULE。 1) 这不是我的问题,2) 我是说我在第一条评论中的意思是您描述了 2 次重复发生,然后您将其理解为两个事件。即您和我在想同样的事情,但是我不确定如何指定要使用的两个可能序列中的哪一个,您在同一评论中解释了一些内容(它是构造函数的参数,与递归规则分开),但它似乎您将我的短语“两个不同的发生”解释为“这种重复应该在两个事件之后停止”,但事实并非如此。

以上是关于在 JavaScript 中计算日期的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中计算日期

在 JavaScript 中计算日期

在 JavaScript 中计算/检查出生日期小于 110 岁

我想在 javascript 中计算保修到期日期

在javascript中计算两个日期时间之间的持续时间

用JavaScript编写计算日期