Поделиться через


Вычисления даты и времени

Объект Объект Date и зависимые методы используются для выполнения общих задач, связанных с календарем и часами, таких как манипулирование датами, их сравнение и вычисление затраченного времени.

Установка текущей даты

При создании экземпляр Объект Date содержит значение, которое представляет конкретный момент во времени с точностью до миллисекунд. В дальнейшем вы можете прочитать или изменить это значение даты и времени.

Следующий пример показывает, как получить текущую дату и представить ее в формате мм/дд/гг.

// 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, Август 24, 2009 и 24 Авг 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 and getFullYear. Эквивалентная группа заданных методов позволяет менять значение в объекте 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 по требованию увеличивает дату до следующего месяца или года. Например, если текущая дата — 28 января и вы добавляете 7 дней, программа правильно установит в качестве даты 4 февраля. В следующем примере к текущей дате добавлена одна неделя. В этом примере из даты также удалено время.

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

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

Работа с месяцами и годами

В следующем примере содержится цикл, который выводит даты начиная с 1 месяца от текущей даты. Месяцы правильно увеличиваются до следующего года.

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);

В следующем примере получен первый день месяца, следующего за текущим. Номер месяца увеличен и задан первый день месяца.

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);

В следующем примере определена дата для праздника Дня Благодарения в США, который приходится на четвертый четверг ноября. Скрипт находит 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 отображает количество миллисекунд, которые прошли с принятой в качестве точки отсчета полуночи 1 января 1970 г. Для даты, предшествующей этой дате, 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, на подходящее число. Например, для превращения миллисекунд в дни можно разделить их количество на 86400000 (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 отображает количество миллисекунд, истекших с полуночи 1 января 1970 г. до значения времени, сохраненного в объекте Объект 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");
}

См. также

Основные понятия

Сводка типов данных