2012-08-13 129 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最新的圖書館看到邊緣情況的處理方式。