在 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/11
到Jan/10/11 23:59:59
它会显示秒到Jan/11/11 0:0:0
,从那时起它会显示秒到Jan/25/11 0:0:0
?如果是这样,Jan/25/11 0:0:0
之后会发生什么?
【参考方案1】:
我不得不做一些类似的事情(不是在 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,虽然还没有完全解决,但这正是我们想要的。再次感谢!【参考方案2】:请找到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
【讨论】:
【参考方案3】:有一个 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 次重复发生,然后您将其理解为两个事件。即您和我在想同样的事情,但是我不确定如何指定要使用的两个可能序列中的哪一个,您在同一评论中解释了一些内容(它是构造函数的参数,与递归规则分开),但它似乎您将我的短语“两个不同的发生”解释为“这种重复应该在两个事件之后停止”,但事实并非如此。【参考方案4】:
看看date.js 库。它有几个日期解析助手,包括Date.today().next().tuesday()
(等等)。
【讨论】:
如何准确地使用它来确定日期 X 是否是固定日期两周的倍数? 没有明显的对重复的支持(至少在文档中),这使得它对这个问题毫无用处以上是关于在 JavaScript 中计算日期的主要内容,如果未能解决你的问题,请参考以下文章