0

我的任务是为一个用 Visual Foxpro 编写的遗留应用程序编写一个 Web 门户。我必须验证怀孕到期日。规则是从当前日期起不能超过 9 个月。我已经试图争辩说这太模糊了,需要几天或几周的时间,但有人告诉我我必须模仿遗留软件。

以下是 VSP 中的代码正在执行的操作:

maxValueForDueDate = GOMONTH(DATE() , 9)

根据MSDN GOMONTH()处理边缘情况如下:

SET CENTURY ON
STORE GOMONTH({^1998-02-16}, 5) TO gdDeadLine

CLEAR
? gdDeadLine  && Displays 07/16/1998
? GOMONTH({^1998-12-31}, 2)  && Displays 02/28/1999
? GOMONTH({^1998-12-31}, -2)  && Displays 10/31/1998

正如您所见,将 2 个月添加到 12 月 31 日不会导致 3 月 2 日,不幸的是,这正是以下 javascript 所做的:

var dDate = new Date('1998-12-31');
dDate.setMonth(dDate.getMonth() + 2);
alert(dDate.toDateString()); // results in - Tue Mar 02 1999

有没有人有他们为这种情况编写的方便的 javascript 函数?我已经用谷歌搜索了,但没有找到我需要的东西。我的第三方使用受限于 JQuery。

4

2 回答 2

1

添加2 个“整月”(即 30 天 x 24 小时)中的毫秒数(或秒数、小时数或天数)。这个想法是改变整个日期,而不仅仅是单个 [月] 组件。例如

var a = new Date('1998-12-31')
var ms_in_month = 30 * (24 * 60 * 60) * 1000
var b_ticks = (+a) + 2 * ms_in_month
var b = new Date(b_ticks)
alert(b) // Sun Feb 28 1999 16:00:00 GMT-0800 (Pacific Standard Time)

(+a)Date 强制为一个数字,该数字导致自纪元以来的毫秒数。(这也可以写成a.milliseconds)。然后new Date(millis_since_epoch)做相反的事情并从纪元偏移量创建一个日期。

免责声明:我不确定确切的规则GOMONTH是什么,它可能使用“一个月中的 30.5 天启发式”(365/12 = 30.41)或其他变体。我怀疑它没有考虑月份持续时间(文档确实指出“-1 [月] 意味着 -31”)或闰年..

于 2012-08-13T19:16:42.513 回答
0

你可以看看开源的javascript日期库Datejs

如果您无法添加此文件,您至少可以查看代码以了解如何处理边缘情况。

于 2012-08-13T19:04:08.467 回答