日期和时间计算
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);
增加和减少天数
上一个示例使用 getMonth、getDate 和 getFullYear 方法获取日期的各个部分。 利用对应的一组 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");
}