C++ sana va vaqt


ULASHISH

Sana va vaqt

<ctime> kutubxonasi sana va vaqt bilan ishlash imkonini beradi.

Undan foydalanish uchun <ctime> sarlavha faylini import qilishingiz kerak:

Misol

#include <ctime> // Import the ctime library

Joriy sana va vaqtni ko‘rsatish

<ctime> kutubxonasida sana va vaqtni o‘lchash uchun turli funksiyalar mavjud.

time() funksiyasi joriy sana va vaqtni ifodalovchi vaqt belgisini (timestamp) beradi. Vaqt belgisi ifodalagan sana va vaqtni ko‘rsatish uchun ctime() funksiyasidan foydalanishimiz mumkin:

Misol

Joriy sanani ko‘rsating:

// Get the timestamp for the current date and time
time_t timestamp;
time(&timestamp);

// Display the date and time represented by the timestamp
cout << ctime(&timestamp);
O‘zingiz sinab ko‘ring »

time() funksiyasidan foydalanishning ikki usuli

time() funksiyasi vaqt belgisini parametr orqali berilgan xotira manziliga yozadi, shu bilan birga vaqt belgisining qiymatini qaytaradi ham.

time() funksiyasidan foydalanishning muqobil usuli — unga NULL ko‘rsatkich uzatib, o‘rniga qaytarilgan qiymatdan foydalanish.

time_t timestamp = time(NULL);

Ma’lumot tiplari

Sana va vaqtni saqlash uchun ikki xil ma’lumot tipi ishlatiladi: vaqt belgilari uchun time_t va sana-vaqt strukturalari uchun struct tm.

Vaqt belgilari vaqtning muayyan lahzasini bitta son sifatida ifodalaydi, bu kompyuterga hisob-kitoblarni bajarishni osonlashtiradi.

Sana-vaqt strukturalari — sana va vaqtning turli tarkibiy qismlarini a’zolar sifatida ifodalovchi strukturalar. Bu bizga sanalarni ko‘rsatishni osonlashtiradi. Sana-vaqt strukturalari 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 (yanvardan boshlab 0 dan 11 gacha)
  • tm_year — 1900-yildan beri o‘tgan yillar soni
  • tm_wday — hafta kuni (yakshanbadan boshlab 0 dan 6 gacha)
  • tm_yday — yilning kuni (0 dan 365 gacha, bunda 0 — 1-yanvar)
  • tm_isdst — yozgi vaqt amalda bo‘lsa musbat, amalda bo‘lmasa nol, noma’lum bo‘lsa manfiy

Sana tarkibiy qismlari qanday ifodalanishini doim yodda tuting:

  • Soatlar 24 soatlik formatda ifodalanadi. Kechki soat 11 23 sifatida ifodalanadi.
  • Oylar 0 dan 11 gacha bo‘ladi. 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 yarata oladi, lekin mktime() funksiyasi yordamida istalgan sana uchun vaqt belgisi yaratishimiz mumkin.

mktime() funksiyasi sana-vaqt strukturasini vaqt belgisiga o‘giradi.

Misol

mktime() funksiyasi yordamida vaqt belgisi yarating:

struct tm datetime;
time_t timestamp;

datetime.tm_year = 2023 - 1900; // Number of years since 1900
datetime.tm_mon = 12 - 1; // Number of months since January
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
// Daylight Savings must be specified
// -1 uses the computer's timezone setting
datetime.tm_isdst = -1;

timestamp = mktime(&datetime);

cout << ctime(&timestamp);
O‘zingiz sinab ko‘ring »

Eslatma: mktime() funksiyasi uchun 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 strukturalarini yaratish

mktime() funksiyasi sana-vaqt strukturasining tm_wday va tm_yday a’zolarini ham to‘g‘ri qiymatlar bilan to‘ldiradi, bu esa strukturani yakunlab, yaroqli sana-vaqtni hosil qiladi. Undan, masalan, berilgan sananing hafta kunini aniqlash uchun foydalanish mumkin:

Misol

Berilgan sananing hafta kunini aniqlang:

// Create the datetime structure and use mktime to fill in the missing members
struct tm datetime;
datetime.tm_year = 2023 - 1900; // Number of years since 1900
datetime.tm_mon = 12 - 1; // Number of months since January
datetime.tm_mday = 17;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);

string weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

cout << "The date is on a " << weekdays[datetime.tm_wday];
O‘zingiz sinab ko‘ring »

localtime() va gmtime() funksiyalari vaqt belgilarini sana-vaqt strukturalariga o‘gira oladi.

localtime() funksiyasi kompyuterning vaqt mintaqasidagi vaqtni ifodalovchi strukturaga ko‘rsatkich qaytaradi.

gmtime() funksiyasi GMT vaqt mintaqasidagi vaqtni ifodalovchi strukturaga ko‘rsatkich qaytaradi.

Bu funksiyalar sana-vaqt strukturasiga ko‘rsatkich qaytaradi. Agar uning qiymati kutilmaganda o‘zgarib qolmasligiga ishonch hosil qilmoqchi bo‘lsak, ko‘rsatkichning qiymatini olish (dereference) orqali undan nusxa olishimiz kerak. Dereference haqida bilish uchun C++ ko‘rsatkich qiymatini olish (dereference) darsiga qarang.

Misol

Sana-vaqt strukturasini oling va joriy soatni chiqaring:

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

cout << datetime.tm_hour;
O‘zingiz sinab ko‘ring »


Sanalarni ko‘rsatish

Hozirgacha vaqt belgisidagi sanani ko‘rsatish uchun ctime() funksiyasidan foydalanib keldik. Sana-vaqt strukturasidagi sanalarni ko‘rsatish uchun asctime() funksiyasidan foydalanishimiz mumkin.

Misol

Sana-vaqt strukturasi ifodalagan sanani ko‘rsating:

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

cout << asctime(&datetime);
O‘zingiz sinab ko‘ring »

Eslatma: asctime() funksiyasi noto‘g‘ri sanalarni tuzatmaydi. Masalan, oy kunini 32 qilib belgilasangiz, u 32 ni ko‘rsatadi. mktime() funksiyasi esa bunday xatolarni tuzata oladi:

Misol

Sanani ko‘rsatishdan oldin uni tuzating:

// Create the datetime structure and use mktime to correct mistakes
struct tm datetime;
datetime.tm_year = 2022 - 1900; // Number of years since 1900
datetime.tm_mon = 0; // 0 is January
datetime.tm_mday = 32;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);

cout << asctime(&datetime);
O‘zingiz sinab ko‘ring »

ctime() va asctime() funksiyalari sanani ko‘rsatish imkonini beradi, lekin u qanday ko‘rinishda chiqishini tanlashga imkon bermaydi.

Sana qanday ko‘rinishda chiqishini tanlash uchun strftime() funksiyasidan foydalanishimiz mumkin.

Misol

Joriy sanani turli ko‘rinishlarda ifodalang:

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";
O‘zingiz sinab ko‘ring »

strftime() funksiyasi sanani formatlaydi va uni C uslubidagi string sifatida char massiviga yozadi. Uning to‘rtta parametri bor:

  1. Birinchi parametr formatlangan sana yoziladigan char massivini ko‘rsatadi.
  2. Ikkinchi parametr massivdagi mavjud joy hajmini belgilaydi.
  3. Uchinchi parametr format spetsifikatorlari yordamida sana qanday formatlanishini tanlash imkonini beradi.
  4. Oxirgi parametr — biz ko‘rsatmoqchi bo‘lgan sanani o‘z ichiga olgan sana-vaqt strukturasiga ko‘rsatkich.

Quyidagi jadvalda ba’zi foydali format spetsifikatorlari keltirilgan. To‘liqroq ro‘yxat uchun strftime() ma’lumotnoma sahifasiga qarang.

Format spetsifikatori Tavsif Misol
%a Hafta kunining qisqa ko‘rinishi Fri
%b Oy nomining qisqa ko‘rinishi Dec
%B Oy nomining to‘liq ko‘rinishi December
%d Oy kuni (boshida nol bilan) 09
%e Oy kuni (boshida bo‘sh joy bilan)  9
%H Soatning 24 soatlik formati 14
%I Soatning 12 soatlik formati 02
%M Soat ichidagi daqiqalar 30
%p AM yoki PM PM
%S Daqiqa ichidagi soniyalar 01
%y Yilning 2 xonali ko‘rinishi 23
%Y Yilning 4 xonali ko‘rinishi 2023

Vaqtni o‘lchash

Vaqt farqlarini o‘lchash uchun ikki xil funksiyadan foydalanish mumkin.

difftime() funksiyasi ikki xil vaqt belgisi orasida o‘tgan soniyalar sonini o‘lchaydi. Bu sanalar orasidagi vaqt farqini o‘lchashda foydali.

Misol

Ikki vaqt belgisi orasidagi vaqt farqini o‘lchang

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 << " seconds until next year";
O‘zingiz sinab ko‘ring »

clock() funksiyasi dastur ishlayotgan paytda qisqa vaqt oraliqlarini o‘lchash uchun foydali. U difftime() funksiyasiga qaraganda aniqroq.

clock funksiyasining har bir chaqiruvi "clock"larda (kutubxona qanday amalga oshirilganiga bog‘liq bo‘lgan vaqt birligi) o‘lchanadigan, clock_t ma’lumot tipiga ega maxsus turdagi vaqt belgisini qaytaradi. Vaqt farqini o‘lchash uchun ikki xil vaqt lahzasida vaqt belgisini saqlang va keyin birini ikkinchisidan ayiring. Vaqt farqi "clock"larda o‘lchanadi, lekin uni CLOCKS_PER_SEC konstantasiga bo‘lish orqali soniyalarga o‘girishingiz mumkin.

Misol

Dastur ishlashi qancha vaqt olishini o‘lchang:

clock_t before = clock();
int k = 0;
for(int i = 0; i < 100000; i++) {
  k += i;
}
clock_t duration = clock() - before;
cout << "Duration: " << (float)duration / CLOCKS_PER_SEC << " seconds";
O‘zingiz sinab ko‘ring »

Eslatma: Bo‘lishdan oldin qiymatni float yoki double tipiga o‘tkazishni unutmang, aks holda butun sonli bo‘lish yuz berib, kasr qismi tashlab yuborilishi mumkin.




<ctime> bo‘yicha to‘liq ma’lumotnoma

<ctime> funksiyalarining to‘liq ro‘yxati uchun C++ ctime ma’lumotnomamizga o‘ting.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!