2012-08-13 126 views
0

我负责编写用Visual Foxpro编写的遗留应用程序的Web门户。我必须验证怀孕到期日。规则是距离当前日期不能超过9个月。我已经试图争辩说这太模糊了,需要几天或几周,但我被告知必须模仿旧版软件。Javascript等效于visual foxpro gomonth()

下面是在VSP的代码是这样做的:

maxValueForDueDate = GOMONTH(DATE() , 9) 

根据MSDNGOMONTH()处理边界情况如下:

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。

回答

1

在2个“满月”(即30天x 24小时)内添加毫秒(或秒或小时或天)的数量。这个想法是,整个日期被移动,并且而不是只是单个[月份]组件。 For example

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)胁迫日期为数字,这导致毫秒数因为划时代的。 (这也可以写成a.milliseconds)。然后new Date(millis_since_epoch)做相反的处理,并从历元偏移中创建一个日期。

免责声明:我不知道什么GOMONTH确切规则 ,它可能会使用“30.5天在一个月启发式”(12分之365= 30.41),或另一种变体。我嫌疑它不占个月的持续时间(在文档中则指出,“-1 [月]表示-31”)或闰年..

+0

我不知道为什么这个工作,但它确实,所以谢谢你。那么30天2个月的平均值是在一个月内的平均值? – Nathan 2012-08-13 19:55:31

+0

@Nathan每月30.5天将会是一年中更好的平均值。大致。我不确定VFP使用什么。如果使用非全天(或关注闰秒),则开始时间应偏向“中午”以解决较小的不确定性。 – 2012-08-13 20:31:37

0

你可以看一下开源Datejs

如果您不能添加这个文件,你至少可以查看代码的JavaScript最新的图书馆看到边缘情况的处理方式。