日期和时间计算

Date 对象和相关方法用于执行常见的日历和时钟任务,如操作和比较日期,以及计算经过的时间。

将日期设置为当前日期

创建 Date 对象的实例时,该实例会包含一个表示某个特定时刻(精确到毫秒)的值。 然后,您可以读取或更改此日期和时间值。

下面的示例演示如何获取当前日期,并以 mm/dd/yy 格式显示该日期。

// Create a date object. Because no arguments are
// passed, the date object contains the current date and
// time (to the millisecond).
var dt : Date = new Date();

// Determine and display the month, day, and year.
// The getMonth method uses a zero offset for
// the month number.
var month : Number = dt.getMonth()+1;
var day : Number = dt.getDate();
var year : Number = dt.getFullYear();

print (month + "/" + day + "/" + year);

设置特定日期

在下面的示例中,向构造函数传递了一个特定日期。

// Create a date object for a specific date.
var dt : Date = new Date('8/24/2009');

JScript 在日期格式方面相当灵活。 它允许各种变体,如“8-24-2009”、“August 24, 2009”和“24 Aug 2009”。

您也可以指定一个时间,如以下示例所示。

// Create a date object for a specific date and time.
// The time format is hours:minutes:seconds.
var dtA : Date = new Date('8/24/2009 14:52:10');

// Create a date object for the same date and time as in
// the previous example.
// The parameters are:
// year, month, day, hours, minutes, seconds.
// August is month 7 because January is month 0.
var dtB : Date = new Date(2009, 7, 24, 14, 52, 10);

增加和减少天数

上一个示例使用 getMonthgetDategetFullYear 方法获取日期的各个部分。 利用对应的一组 set 方法,可以更改 Date 对象中的值。

下面的示例演示如何将日期设置为前一天的日期。 该示例获取当天的日期以及当天是该月的第几天,然后使用 setDate 方法将当天日期设置为它的前一天。

// Get the current day's date and day of month.
var myDate : Date = new Date();
var dayOfMonth : Number = myDate.getDate();

// Reset myDate to one day earlier.
myDate.setDate(dayOfMonth - 1);

JScript 会根据需要将日期递增到下一月或下一年。 例如,如果当前日期是 1 月 28 日,并且您增加了 7 天,则它会将该日期正确设置为 2 月 4 日。 下面的示例将当前日期增加一周。 此示例中还将从日期中清除时间。

var myDate : Date = new Date();
myDate.setDate(myDate.getDate() + 7);

// Clear the time.
myDate.setHours(0, 0, 0, 0);

处理月和年

下面的示例包含一个循环,此循环输出从当前日期开始按月递增的各个日期。 月份将会正确递增到下一年。

var currentDate : Date = new Date();

for(var index : int = 1; index <= 12; index++)
{
    var myDate : Date = new Date();
    myDate.setMonth(currentDate.getMonth() + index);

    print ("Month+" + index + ": " + myDate);
}

下面的示例获取当前日期的前一年的日期。

var myDate : Date = new Date();
myDate.setFullYear (myDate.getFullYear() - 1);

下面的示例获取当前月份的下一个月份的第一天。 该示例将递增月份,然后将月份的日期设置为 1。

function GetFirstOfNextMonth() : Date
{
    var myDate : Date = new Date();
    myDate.setMonth(myDate.getMonth() + 1);
    myDate.setDate(1);

    return myDate;
}

下面的示例确定当前月份的最后一天。 为此,该示例将确定下一个月份的第一天,然后将它减去一天。

// Determine the last day of the current month.
// The GetFirstOfNextMonth() function is in the previous example.
var myDate : Date = GetFirstOfNextMonth();
myDate.setDate (myDate.getDate() - 1);

处理周日期

getDay 方法(不要与 getDate 混淆)将返回一个介于 0 和 6 之间的值以指示周日期。 0 指示周日,1 指示周一,依次类推。 下面的示例演示如何确定当前的周日期。

var arDays : Array = ["Sunday", "Monday", "Tuesday",
    "Wednesday", "Thursday", "Friday", "Saturday"];

var today : Date = new Date();
var dayNum : Number = today.getDay();
var dayOfWeek : String = arDays[dayNum];

下面的示例返回当前日期的前一个星期五的日期。

function getPreviousDayOfWeek(dayOfWeekNum : Number) : Date
{
    var dt : Date = new Date();
    if (dt.getDay() == dayOfWeekNum)
    {
        // It is currently the day of the week specified in
        // the function call. Subtract one week.
        dt.setDate(dt.getDate() - 7);
    }
    else
    {
        // Go back a day at a time until arriving
        // at the specified day of week.
        while (dt.getDay() != dayOfWeekNum)
        {
            dt.setDate(dt.getDate() - 1);
        }
    }

    return dt;
}

var friday : Number = 5;
var myDate : Date = getPreviousDayOfWeek(friday);

下面的示例确定美国感恩节 的日期,该日期定义为十一月的第四个星期四。 该脚本先找到当前年份的 11 月 1 日,再找到第一个星期四,然后增加三周。

// Determine the current date and clear the time.
var myDate : Date = new Date();
myDate.setHours(0, 0, 0, 0);

// Determine November 1 of the current year.
var november : Number = 10;
myDate.setMonth(november);
myDate.setDate(1);

// Find Thursday.
var thursday : Number = 4;
while(myDate.getDay() != thursday)
{
    myDate.setDate(myDate.getDate() + 1) ;
}

// Add 3 weeks.
myDate.setDate(myDate.getDate() + 21);

计算经过的时间

getTime 方法返回自零日期和时间(1970 年 1 月 1 日午夜)起经过的毫秒数。 对于该日期之前的日期,getTime 将返回一个负数。

可以使用 getTime 设置一个开始时间和结束时间以计算经过的时间。 它可用于测量较小单位(如秒数)和较大单位(如天数)。

确定经过的时间(以秒为单位)

此示例计算经过的时间(以秒为单位)。 不管时间间隔多大,此示例都有效。 getTime 方法报告的毫秒数是一个从零日期开始的绝对值。 因此,随着分钟、小时和日期的更改,它们不断地增长。

Console.Write("What is your name? ");

var startTime : Date = new Date();
var name : String = Console.ReadLine();
var endTime : Date = new Date();

var elapsed : Number = 
    (endTime.getTime() - startTime.getTime()) / 1000; 

Console.WriteLine("You took " + elapsed +
    " seconds to type your name.");

确定经过的时间(以天为单位)

若要使用更易于管理的单位,可以将 getTime 方法提供的毫秒数除以某个适当的数字。 例如,若要将毫秒数转换为天数,可以将毫秒数除以 86,400,000 (1000 x 60 x 60 x 24)。

下面的示例演示自当前年份的第一天起经过的时间。 此示例使用一系列除法运算来计算经过的时间(以天、小时、分钟和秒为单位)。 此示例不考虑夏时制时间。

// Set the unit values in milliseconds.
var msecPerMinute : Number = 1000 * 60;
var msecPerHour : Number = msecPerMinute * 60;
var msecPerDay : Number = msecPerHour * 24;

// Determine the current date and time.
var today : Date = new Date();

// Determine January 1, at midnight, of the current year.
var january : Number = 0;
var startOfYear : Date = new Date();
startOfYear.setMonth(january);
startOfYear.setDate(1);
startOfYear.setHours(0, 0, 0, 0);

// Determine the difference in milliseconds.
var interval : Number = today.getTime() - startOfYear.getTime();

// Calculate how many days the interval contains. Subtract that
// many days from the interval to determine the remainder.
var days : Number = Math.floor(interval / msecPerDay );
interval = interval - (days * msecPerDay );

// Calculate the hours, minutes, and seconds.
var hours : Number = Math.floor(interval / msecPerHour );
interval = interval - (hours * msecPerHour );

var minutes : Number = Math.floor(interval / msecPerMinute );
interval = interval - (minutes * msecPerMinute );

var seconds : Number = Math.floor(interval / 1000 );

// Display the result.
var msg : String = days + " days, " + hours + " hours, "
 + minutes + " minutes, " + seconds + " seconds.";

print(msg);

确定用户的年龄

下面的示例确定用户在各个年份的年龄。 此示例用当前年份减去用户的出生年份,如果用户在当前年份中的生日目前还没有到,则再减去 1。 此示例不使用已经过的毫秒数,因为我们的年龄不是基于严格的时间间隔来定义的。

var birthday : Date = new Date("8/1/1985");
var today : Date = new Date();
var years : Number = today.getFullYear() - birthday.getFullYear();

// Reset birthday to the current year.
birthday.setFullYear(today.getFullYear());

// If the user's birthday has not occurred yet this year, subtract 1.
if (today < birthday)
{
    years--;
}
print("You are " + years + " years old.");

提示

在比较日期时必须小心,以确保正确执行此操作。 您可以从本主题的下一节中了解有关此操作的更多信息。

下面的示例演示一个用于按月份计算用户年龄的方法。 该脚本包含一个用于确定用户生日是否在当前月份发生的测试。

var birthday : Date = new Date("8/1/1985");
var today : Date = new Date();
var years : Number = today.getFullYear() - birthday.getFullYear();

// Determine the number of months.
var months : Number = (years * 12) +
    (today.getMonth() - birthday.getMonth());

// Adjust the months if the birthday has not occurred
// yet in the current month.
if (today.getDate() < birthday.getDate())
{
    months--;
}
print("You are " + months + " months old.");

比较日期

在 JScript 中,如果使用大于或小于比较(<、>、<= 或 >=)来比较对象,则在执行相应比较之前将计算对象的值。 相等比较的工作方式不同。 如果使用的是 == 运算符,则该比较只会在此运算符两侧都指向同一对象时才返回 true。 != 运算符的工作方式与其类似。

getTime 方法返回 1970 年 1 月 1 日午夜与 Date 对象中的时间值之间的毫秒数。 这使您能够比较两个日期的毫秒表示形式。

不过,如果其中一个 Date 对象包含一个非午夜时间,则基于毫秒的日期比较将无法正确工作。

如果创建一个不包含构造函数参数的 Date 对象,则与日期关联的时间为当前时间。 如果为某个特定日期创建 Date 对象,则与该日期关联的时间为当天的起点,即午夜。

下面的示例检查当前日期是否与指定日期相同。 为了在 todayAtMidn 中设置当前日期,该脚本会为当前年份、月份和天创建 Date 对象。

// Determine the current date and time, and then
// determine the current date at midnight.
var now : Date = new Date(); 
var todayAtMidn : Date =
    new Date(now.getFullYear(), now.getMonth(), now.getDate());

// Set specificDate to a specified date at midnight.
var specificDate : Date = new Date("9/21/2009");

// Compare the two dates by comparing the millisecond
// representations.
if (todayAtMidn.getTime() == specificDate.getTime())
{
    print("Same");
}
else
{
    print("Different");
}

请参见

概念

数据类型摘要