Гузариш ба мундариҷа
Мавзӯи 21 аз 21
Назария

Сана ва вақт

Ин барои чӣ лозим аст

Санаҳо қариб дар ҳар барнома ҳастанд: вақти паём дар чат, мӯҳлати расонидан, «3 рӯз пеш нашр шуд», тақвим, таймер то охири аксия, синну соли корбар. Дар JavaScript барои ин объекти дарунсохти Date ҳаст. Вай якчанд дом дорад, ки барномаҳои навомӯзонро — ва барномасозони ботаҷрибаро ҳам — мешикананд. Онҳоро дида мебароем.

Сохтани сана

const now = new Date();                       // лаҳзаи ҷорӣ
const newYear = new Date(2026, 0, 1);         // 1 январи 2026, 00:00 бо вақти маҳаллӣ
const iso = new Date("2026-11-02");           // аз сатр дар формати ISO
const fromMs = new Date(0);                   // аз тамғаи вақт

console.log(newYear.getFullYear(), newYear.getMonth(), newYear.getDate());

Натиҷа:

2026 0 1

Доми асосӣ: моҳҳо аз сифр ҳисоб мешаванд. Январ — 0, феврал — 1, декабр — 11. Рӯзҳои моҳ бошанд — аз як, мисли одатӣ. Барои ҳамин ҳангоми нишон додани моҳ getMonth() + 1 менависанд.

Тамғаи вақт

Дар дохил Date як адад-ро нигоҳ медорад — чанд миллисония аз 1 январи соли 1970 бо вақти Гринвич (UTC) гузаштааст. Ин ададро тамғаи вақт (timestamp) меноманд:

console.log(new Date(0).toISOString());
console.log(new Date("2026-01-01T00:00:00Z").getTime());

Натиҷа:

1970-01-01T00:00:00.000Z
1767225600000

Тамғаи ҷорӣ — Date.now(). Онро барои чен кардани вақт истифода мебаранд:

const start = Date.now();
for (let i = 0; i < 1e6; i++) {}
console.log("Давра камтар аз як сония гирифт: " + (Date.now() - start < 1000));

Натиҷа:

Давра камтар аз як сония гирифт: true

Қисмҳои сана

Гирифтан Чӣ бармегардонад
getFullYear() сол, масалан 2026
getMonth() моҳ 0–11
getDate() рӯзи моҳ 1–31
getDay() рӯзи ҳафта 0–6, ки дар он 0 — якшанбе
getHours(), getMinutes(), getSeconds() вақт
getTime() тамғаи вақт
const d = new Date(2026, 10, 2, 14, 5);   // 2 ноябри 2026, 14:05
const days = ["яш", "дш", "сш", "чш", "пш", "ҷм", "шб"];
console.log(days[d.getDay()]);
console.log(`${d.getHours()}:${String(d.getMinutes()).padStart(2, "0")}`);

Натиҷа:

дш
14:05

Барои ҳар get… як set… ҳаст: setFullYear, setMonth, setDate, setHours…

Сана худаш ислоҳ мешавад

Агар рӯзи «вуҷуднадошта»-ро нишон диҳед, Date зиёдатиро ба моҳи навбатӣ мегузаронад. Ин хато нест, балки асбоби қулай аст:

console.log(new Date(2026, 1, 30).getDate(), new Date(2026, 1, 30).getMonth());   // 30 феврал?

const d = new Date(2026, 11, 30);
d.setDate(d.getDate() + 5);                 // плюс 5 рӯз
console.log(d.getFullYear(), d.getMonth(), d.getDate());

const lastDay = new Date(2024, 2, 0);       // «сифрум»-и март = рӯзи охири феврал
console.log(lastDay.getDate());

Натиҷа:

2 2
2027 0 4
29

30 феврал 2 март шуд, 30 декабр + 5 рӯз — 4 январи соли оянда, ва рӯзи 0 рӯзи охири моҳи пешинаро медиҳад (дар соли 2024 феврал 29 рӯз дошт).

Фарқи байни санаҳо

Агар як санаро аз дигаре тарҳ кунед, фарқ бо миллисонияҳо ҳосил мешавад. Барои ба рӯзҳо гузарондан ба шумораи миллисонияҳо дар як шабонарӯз тақсим мекунанд: 1000 * 60 * 60 * 24 = 86400000:

const start = new Date("2026-09-01");
const end = new Date("2026-12-31");
const days = Math.round((end - start) / 86400000);
console.log("Рӯзҳо то охири сол: " + days);

Натиҷа:

Рӯзҳо то охири сол: 121

Math.round аз сабаби гузариш ба вақти тобистона дар баъзе кишварҳо лозим аст: он гоҳ дар шабонарӯз 23 ё 25 соат мешавад.

ISO ва минтақаҳои вақт

Формати боэътимодтарини сана дар сатр — ISO 8601: 2026-11-02T14:05:00Z. Ҳарфи Z маънои «вақт бо UTC»-ро дорад. Онро серверҳо ва JSON истифода мебаранд:

const d = new Date(Date.UTC(2026, 10, 2, 9, 30));
console.log(d.toISOString());
console.log(JSON.stringify({ created: d }));

Натиҷа:

2026-11-02T09:30:00.000Z
{"created":"2026-11-02T09:30:00.000Z"}

Ҳамон як лаҳзаи вақт дар кишварҳои гуногун гуногун менамояд: 09:30 бо UTC — ин 14:30 дар Душанбе (UTC+5) ва 12:30 дар Маскав (UTC+3) аст. Барои ҳамин:

  • getHours(), getDate() ва дигарҳо вақтро бо минтақаи вақти компютер бармегардонанд;
  • getUTCHours(), getUTCDate()… — бо UTC;
  • new Date("2026-11-02") (танҳо сана) ҳамчун нисфишаб бо UTC таҳлил мешавад, new Date(2026, 10, 2) бошад — ҳамчун нисфишаб бо вақти маҳаллӣ.

Қоида: санаҳоро бо UTC (сатри ISO ё тамғаи вақт) нигоҳ доред ва фиристед, ва ба вақти маҳаллӣ танҳо ҳангоми нишон додан ба корбар гузаронед.

Намоиши зебо барои одамон

toLocaleDateString ва toLocaleTimeString санаро аз рӯи қоидаҳои забон формат мекунанд:

const d = new Date(Date.UTC(2026, 10, 2, 9, 30));
console.log(d.toLocaleDateString("ru-RU", { timeZone: "UTC" }));
console.log(d.toLocaleDateString("en-US", { timeZone: "UTC" }));
console.log(d.toLocaleDateString("en-US", { day: "numeric", month: "long", year: "numeric", timeZone: "UTC" }));

Натиҷа:

02.11.2026
11/2/2026
November 2, 2026

Бе timeZone минтақаи вақти корбар истифода мешавад — дар сайтҳо одатан маҳз ҳамин лозим аст.

Дар дохил чӣ гуна кор мекунад

Date — ин печонаки як адади тамға аст. Ҳамаи get… сол, моҳ ва соатро аз ин адад бо назардошти минтақаи вақт ҳисоб мекунанд, ва set… тамғаро аз нав ҳисоб мекунанд. Барои ҳамин ду санаро тавассути тамғаҳо муқоиса мекунанд: a.getTime() === b.getTime(). a === b-и оддӣ объектҳо-ро муқоиса мекунад ва ҳатто барои санаҳои якхела false медиҳад, аммо < ва > кор мекунанд, чунки санаҳоро ба ададҳо табдил медиҳанд.

Объекти Date тағйирёбанда аст: setDate онро дар ҷояш иваз мекунад. Агар сана аз берун ба функсия омада бошад ва онро ҷобаҷо кардан лозим бошад, аввал нусха созед: const copy = new Date(date);.

Барои кори мураккаб бо санаҳо (минтақаҳои вақт, «баъд аз 2 моҳ», тақвимҳо) дар лоиҳаҳо аксар вақт китобхонаҳои date-fns ё dayjs-ро истифода мебаранд, ва дар версияҳои нави JavaScript Temporal-и дарунсохт пайдо мешавад.

Хатоҳои маъмул

  1. Моҳ аз сифр. new Date(2026, 1, 1) — ин 1 феврал аст. Ҳангоми нишон додан — getMonth() + 1.
  2. getDay ба ҷойи getDate. getDay — рӯзи ҳафта, getDate — рақами моҳ.
  3. Синну сол бо тақсим ба 365. Солҳои кабиса хатои як-ду рӯзро медиҳанд. Солҳо, моҳҳо ва рӯзҳоро муқоиса кунед.
  4. Муқоиса бо ===. getTime()-ро муқоиса кунед.
  5. Санаи бегонаро иваз карданд. setDate объектро иваз мекунад — нусха созед.
  6. Сатр дар формати номафҳум. new Date("02.11.2026")-ро браузерҳои гуногун гуногун мефаҳманд. ISO 2026-11-02 ё ададҳоро истифода баред.

Ёддошт

Чӣ Чӣ тавр
Ҳозир new Date(), тамға — Date.now()
Санаи мушаххас new Date(2026, 10, 2) (моҳ аз сифр!)
Аз ISO new Date("2026-11-02T14:05:00Z")
Қисмҳо getFullYear(), getMonth() + 1, getDate(), getDay()
Ҷобаҷо кардан d.setDate(d.getDate() + 7)
Фарқ бо рӯзҳо Math.round((b - a) / 86400000)
Ба ISO d.toISOString()
Барои одамон d.toLocaleDateString("ru-RU")
Ду рақам String(n).padStart(2, "0")

Чанд рӯз

Осон+10 XP

Функсияи daysBetween(from, to)-ро нависед. Ҳарду сана — сатрҳо дар формати СССС-ММ-РР. Баргардонед, ки аз from то to чанд рӯз аст (агар to пештар бошад — адад манфӣ).

daysBetween("2026-01-01", "2026-01-31")   → 30
daysBetween("2026-03-01", "2026-02-01")   → -28

Барои ҳал кардани масъалаҳо коннекторро пайваст кун

Коди масъалаҳо дар компютери худат иҷро мешавад — ин аз браузер тезтар ва боэътимодтар аст. Барои ин барномаи ройгони коннектори CodeWithMe лозим аст. Онро як бор пайваст кардан кифоя аст.

Коннекторро дар ин компютер ҷустуҷӯ мекунем…

  1. 1
    Коннекторро барои системаи худ (Windows, macOS ё Linux) зеркашӣ кун.Зеркашии коннекторДар саҳифаи зеркашӣ файлеро интихоб кун, ки дар номаш системаи ту ҳаст, масалан windows-amd64.
  2. 2Онро иҷро кун ва ҷузвдонеро интихоб кун, ки ҳалҳоят дар он ҷо меистанд. Python ва Node.js-ро ӯ худаш ҳангоми зарурат ба он ҷо мегузорад.
  3. 3
    Дар поён рамзи 6-рақамаро ворид кун — он дар равзанаи коннектор навишта шудааст («Рамз барои сайти CodeWithMe»). Агар браузер дар бораи дастрасӣ ба шабакаи маҳаллӣ пурсад — иҷозат деҳ.

Коннектор кушода аст (рамзи манбаъ дар GitHub), танҳо дар компютери ту кор мекунад ва кодро танҳо пас аз ворид кардани рамзи пайвастшавӣ иҷро мекунад.