我的任务是编写一个用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
正如你所看到的那样,到12月31日增加2个月不会导致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函数?我用Google搜索过,但还没找到我需要的东西。我的第三方用法仅限于JQuery。
答案 0 :(得分: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天启发式”(365/12 = 30.41)或其他变体。我怀疑它不考虑月份持续时间(文档确实说明“-1 [月]表示-31 天”)或闰年..
答案 1 :(得分:0)
您可以查看开源javascript日期库Datejs
如果您无法添加此文件,您至少可以查看代码以查看边缘案例的处理方式。