https://www.timeanddate.com/date/weekday.html menghitung berbagai fakta tentang hari dalam setahun, misalnya:
Diberikan tanggal sewenang-wenang, bagaimana angka-angka ini dapat dihitung dengan spesifikasi chrono C ++ 20 ?
https://www.timeanddate.com/date/weekday.html menghitung berbagai fakta tentang hari dalam setahun, misalnya:
Diberikan tanggal sewenang-wenang, bagaimana angka-angka ini dapat dihitung dengan spesifikasi chrono C ++ 20 ?
Jawaban:
Ini sangat mudah dengan spesifikasi chrono C ++ 20 . Di bawah ini saya menunjukkan fungsi yang menginput tanggal sewenang-wenang, dan mencetak informasi ini ke
cout
. Padahal pada saat penulisan ini, spesifikasi ch ++ C ++ 20 belum dikirimkan, diperkirakan oleh pustaka sumber terbuka yang gratis . Jadi Anda dapat bereksperimen dengannya hari ini, dan bahkan memasukkannya dalam aplikasi pengiriman selama Anda mengadopsi C ++ 11 atau lebih baru.Jawaban ini akan mengambil bentuk fungsi:
sys_days
adalah ketelitian seharitime_point
dalamsystem_clock
keluarga. Itu berarti hanya hitungan hari sejak 1970-01-01 00:00:00 UTC. Tipe aliassys_days
baru dengan C ++ 20, tetapi tipe yang mendasarinya telah tersedia sejak C ++ 11 (time_point<system_clock, duration<int, ratio<86400>>>
). Jika Anda menggunakan pustaka pratinjau C ++ 20 sumber terbuka ,sys_days
ada dinamespace date
.Kode di bawah ini mengasumsikan fungsi-lokal:
untuk mengurangi verbositas. Jika Anda bereksperimen dengan pustaka pratinjau C ++ 20 sumber terbuka , asumsikan juga:
Tajuk
Untuk menghasilkan dua baris pertama adalah sederhana:
Ambil saja tanggal
sd
dan gunakanformat
dengan familiarstrftime
/put_time
bendera untuk mencetak tanggal dan teks. The open-source C ++ 20 perpustakaan pratinjau belum terintegrasi perpustakaan fmt , dan menggunakan format string sedikit diubah"%d %B %Y is a %A\n"
.Ini akan menampilkan (misalnya):
Hasil antara umum dihitung sekali
Bagian fungsi ini ditulis terakhir, karena seseorang belum tahu perhitungan apa yang akan dibutuhkan beberapa kali. Tapi begitu Anda tahu, inilah cara menghitungnya:
Kita akan membutuhkan bidang tahun dan bulan
sd
, danweekday
(hari dalam seminggu). Adalah efisien untuk menghitungnya sekali dan untuk semua dengan cara ini. Kami juga akan membutuhkan (beberapa kali) hari-hari pertama dan terakhir tahun berjalan. Sulit untuk mengatakan pada saat ini, tetapi efisien untuk menyimpan nilai-nilai ini sebagai jenissys_days
sebagai penggunaan selanjutnya mereka hanya dengan hari-berorientasi aritmatika yangsys_days
merupakan sangat efisien (kecepatan sub-nanodetik).Fakta 1: jumlah hari dalam setahun, dan jumlah hari tersisa dalam tahun
Ini mencetak jumlah hari dalam setahun, dengan 1 Januari menjadi hari 1, dan kemudian juga mencetak jumlah hari yang tersisa di tahun itu, tidak termasuk
sd
. Perhitungan untuk melakukan ini sepele. Membagi setiap hasil dengandays{1}
cara untuk mengekstraksi jumlah hari dalamdn
dandl
menjadi tipe integral untuk tujuan pemformatan.Fakta 2: Jumlah hari kerja ini dan jumlah hari kerja dalam setahun
wd
adalah hari dalam seminggu (Senin hingga Minggu) yang dihitung di bagian atas artikel ini. Untuk melakukan perhitungan ini, pertama-tama kita perlu tanggal yang pertama dan terakhirwd
di tahun tersebuty
.y/1/wd[1]
adalah yang pertamawd
di bulan Januari, dany/12/wd[last]
yang terakhirwd
di bulan Desember.Jumlah total
wd
s dalam tahun ini hanya jumlah minggu antara kedua tanggal ini (ditambah 1). Sub-ekspresilast_wd - first_wd
adalah jumlah hari antara dua tanggal. Membagi hasil ini dengan 1 minggu menghasilkan tipe integral yang menahan jumlah minggu antara kedua tanggal.Jumlah minggu dilakukan dengan cara yang sama dengan jumlah total minggu kecuali satu dimulai dengan hari saat ini bukan yang terakhir
wd
tahun ini:sd - first_wd
.Fakta 3: Jumlah hari kerja ini dan jumlah hari kerja dalam sebulan
Ini berfungsi seperti Fakta 2, kecuali kita mulai dengan pasangan pertama dan terakhir
wd
dari pasangan tahun-bulan,y/m
bukan sepanjang tahun.Fakta 4: Jumlah hari dalam setahun
Kode ini cukup banyak berbicara sendiri.
Fakta 5 Jumlah hari dalam sebulan
Ungkapannya
y/m/last
adalah hari terakhir dari pasangan tahun-bulany/m
, dan tentu sajay/m/1
adalah hari pertama bulan itu. Keduanya dikonversisys_days
sehingga mereka dapat dikurangkan untuk mendapatkan jumlah hari di antara mereka. Tambahkan 1 untuk hitungan berbasis 1.Menggunakan
info
dapat digunakan seperti ini:atau seperti ini:
Berikut ini contoh output:
Edit
Bagi mereka yang tidak menyukai "sintaksis konvensional", ada "sintaks konstruktor" lengkap yang dapat digunakan sebagai gantinya.
Sebagai contoh:
dapat diganti dengan:
sumber
std::cout << "a*b = " << a*b << "; a^b = " << a^b << '\n';
(yang, untungnya, hampir selalu tertangkap pada waktu kompilasi, tetapi masih mengganggu). Jadi saya akan berhati-hati ketika menggunakan penyalahgunaan operator divisi baru ini.