Skip to content

Sana va vaqt (Date and Time)

Sana va vaqt

<ctime> kutubxonasi sanalar va vaqtlar bilan ishlash imkonini beradi.

Undan foydalanish uchun <ctime> sarlavha faylini import qiling:

MISOL

cpp
#include <ctime> // ctime kutubxonasini import qilish

Joriy sana va vaqtni ko'rsatish

<ctime> kutubxonasida sanalar va vaqtlarni o'lchash uchun turli funksiyalar mavjud.

time() funksiyasi joriy sana va vaqtni ifodalovchi vaqt belgisi (timestamp) beradi. ctime() funksiyasi vaqt belgisi ifodalagan sana va vaqtni ko'rsatish uchun ishlatiladi:

MISOL

cpp
// Joriy sana va vaqt uchun vaqt belgisini olish
time_t timestamp;
time(&timestamp);

// Vaqt belgisi ifodalagan sana va vaqtni ko'rsatish
cout << ctime(&timestamp);

TIME() FUNKSIYASINI ISHLATISHNING IKKI USULI

time() funksiyasi parametr orqali berilgan xotira manziliga vaqt belgisini yozadi, lekin u vaqt belgisining qiymatini ham qaytaradi.

time() funksiyasini ishlatishning muqobil usuli — NULL ko'rsatkich uzatish va qaytarish qiymatidan foydalanish:

cpp
time_t timestamp = time(NULL);

Ma'lumot turlari

Sana va vaqtni saqlash uchun ikkita ma'lumot turi ishlatiladi: vaqt belgilari uchun time_t va sana-vaqt tuzilmalari uchun struct tm.

Vaqt belgilari vaqt lahzasini bitta raqam sifatida ifodalaydi, bu kompyuter hisoblashlarini osonlashtiradi.

Sana-vaqt tuzilmalari sana va vaqtning turli komponentlarini a'zolar sifatida ifodalaydi. Quyidagi a'zolarga ega:

  • tm_sec — daqiqa ichidagi soniyalar
  • tm_min — soat ichidagi daqiqalar
  • tm_hour — kun ichidagi soat (0 dan 23 gacha)
  • tm_mday — oyning kuni
  • tm_mon — oy (0 dan 11 gacha, yanvardan boshlab)
  • tm_year — 1900 yildan beri o'tgan yillar soni
  • tm_wday — hafta kuni (0 dan 6 gacha, yakshanba bilan boshlab)
  • tm_yday — yilning kuni (0 dan 365 gacha, 0 — yanvar 1)
  • tm_isdst — yozki vaqt amal qilganda musbat, amal qilmaganda nol, noaniq bo'lganda manfiy

ESLATMA

Sana komponentlarining ifodalanishini doimo yodda tuting:

  • Soatlar 24 soatlik formatda ifodalanadi. Kechki 11 23 sifatida ifodalanadi.
  • Oylar 0 dan 11 gacha. Masalan, dekabr 12 emas, 11 sifatida ifodalanadi.
  • Yillar 1900 yilga nisbatan ifodalanadi. 2024 yil 124 sifatida ifodalanadi, chunki 1900 yildan beri 124 yil o'tgan.

Vaqt belgilarini yaratish

time() funksiyasi faqat joriy sana uchun vaqt belgisi yaratishi mumkin, lekin mktime() funksiyasi yordamida ixtiyoriy sana uchun vaqt belgisi yaratish mumkin.

mktime() funksiyasi sana-vaqt tuzilmasini vaqt belgisiga aylantiradi:

MISOL

cpp
struct tm datetime;
time_t timestamp;

datetime.tm_year = 2023 - 1900; // 1900 yildan beri yillar soni
datetime.tm_mon = 12 - 1;       // Yanvardan beri oylar soni
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
// Yozgi vaqt belgilanishi kerak
// -1 kompyuterning vaqt mintaqasi sozlamasini ishlatadi
datetime.tm_isdst = -1;

timestamp = mktime(&datetime);

cout << ctime(&timestamp);

ESLATMA

mktime() funksiyasiga quyidagi a'zolar qiymatga ega bo'lishi kerak: tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec va tm_isdst.


Sana-vaqt tuzilmalarini yaratish

mktime() funksiyasi sana-vaqt tuzilmasining tm_wday va tm_yday a'zolarini to'g'ri qiymatlar bilan to'ldiradi. Masalan, berilgan sananing hafta kunini topish uchun ishlatilishi mumkin:

MISOL

cpp
struct tm datetime;
datetime.tm_year = 2023 - 1900;
datetime.tm_mon = 12 - 1;
datetime.tm_mday = 17;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);

string weekdays[] = {"Yakshanba", "Dushanba", "Seshanba", "Chorshanba", "Payshanba", "Juma", "Shanba"};

cout << "Sana " << weekdays[datetime.tm_wday] << " kuniga to'g'ri keladi";

localtime() va gmtime() funksiyalari vaqt belgilarini sana-vaqt tuzilmalariga aylantirishi mumkin.

  • localtime() — kompyuterning vaqt mintaqasidagi vaqtni ifodalovchi tuzilmaga ko'rsatkich qaytaradi
  • gmtime() — GMT vaqt mintaqasidagi vaqtni ifodalovchi tuzilmaga ko'rsatkich qaytaradi

MISOL

cpp
time_t timestamp = time(&timestamp);
struct tm datetime = *localtime(&timestamp);

cout << datetime.tm_hour;

Sanalarni ko'rsatish

strftime() funksiyasi sanani xohlagan formatda ko'rsatish imkonini beradi:

MISOL

cpp
time_t timestamp = time(NULL);
struct tm datetime = *localtime(&timestamp);

char output[50];

strftime(output, 50, "%B %e, %Y", &datetime);
cout << output << "\n";

strftime(output, 50, "%I:%M:%S %p", &datetime);
cout << output << "\n";

strftime(output, 50, "%m/%d/%y", &datetime);
cout << output << "\n";

strftime(output, 50, "%a %b %e %H:%M:%S %Y", &datetime);
cout << output << "\n";

Foydali format spetsifikatorlari:

SpetsifikatorTavsifMisol
%aHafta kunining qisqa ko'rinishiFri
%bOy nomining qisqa ko'rinishiDec
%BOy nomining to'liq ko'rinishiDecember
%dOyning kuni (bosh nol bilan)09
%H24 soatlik soat formati14
%I12 soatlik soat formati02
%MSoat ichidagi daqiqalar30
%pAM yoki PMPM
%SDaqiqa ichidagi soniyalar01
%y2 raqamli yil23
%Y4 raqamli yil2023

Vaqtni o'lchash

difftime() funksiyasi ikki turli vaqt belgilari orasida o'tgan soniyalar sonini o'lchaydi:

MISOL

cpp
time_t now;
time_t nextyear;
struct tm datetime;

now = time(NULL);
datetime = *localtime(&now);
datetime.tm_year = datetime.tm_year + 1;
datetime.tm_mon = 0;
datetime.tm_mday = 1;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
nextyear = mktime(&datetime);

int diff = difftime(nextyear, now);

cout << diff << " soniya keyingi yilgacha";

clock() funksiyasi dastur ishlayotganda qisqa vaqt oraliqlarini o'lchash uchun foydali:

MISOL

cpp
clock_t before = clock();
int k = 0;
for(int i = 0; i < 100000; i++) {
  k += i;
}
clock_t duration = clock() - before;
cout << "Davomiyligi: " << (float)duration / CLOCKS_PER_SEC << " soniya";

ESLATMA

Bo'lishdan oldin qiymatni float yoki double turiga o'tkazganingizga ishonch hosil qiling, aks holda butun songa bo'lish yuz berishi mumkin.


To'liq <ctime> manbasi

<ctime> funksiyalarining to'liq ro'yxati uchun C++ ctime manbasi sahifasiga o'ting.