Cara menangani dst di javascript

Waktu memainkan peran penting dalam hidup kita. Oleh karena itu, sebagai pengembang, kami cukup sering bekerja dengan tanggal dan waktu. Perangkat lunak komputer digunakan oleh orang-orang dari mana saja di dunia dan waktu di satu wilayah dapat berbeda dengan waktu di wilayah lain. Dan, umumnya dalam perangkat lunak yang kami bangun kami menangkap dan memproses tanggal dan waktu dari berbagai rekaman data dan peristiwa. Oleh karena itu, penting untuk memahami berbagai nuansa seputar bekerja dengan tanggal dan waktu

Tanggal dan waktu dapat direpresentasikan dalam berbagai format. Di Ukraina, tanggal biasanya ditulis dengan format "DD-MM-YYYY" [hari adalah yang pertama], sedangkan di Amerika Serikat format yang umum adalah "MM-DD-YYYY" [bulan adalah yang pertama].

Bergantung pada wilayah geografis atau unit politik [mis. g. , negara], zona waktu dapat berbeda. Misalnya, di musim panas, sedangkan di Kyiv waktunya adalah 21. 00, di New York waktu menunjukkan pukul 14. 00 [minus tujuh jam]. Selain itu, penting untuk disebutkan bahwa pilihan/definisi zona waktu di negara/wilayah tertentu dapat dipengaruhi oleh keputusan politik. Suatu negara dapat memilih offset UTC yang berbeda dari offset UTC lokasi geografis sebenarnya di negara tersebut

Semua zona waktu ditentukan sebagai offset ke Waktu Universal Terkoordinasi [UTC], mulai dari UTC-12. 00 hingga UTC+14. 00. Titik referensi geografis untuk UTC adalah meridian utama [garis bujur = 0°], yang melewati Observatorium Kerajaan di Greenwich, London, Inggris Raya

Selain itu, di berbagai belahan dunia orang mempraktikkan Daylight Saving Time [DST] atau dengan kata lain - waktu musim panas. Ini adalah praktik memajukan jam satu jam dari waktu standar selama bulan-bulan hangat untuk mendapatkan lebih banyak cahaya matahari selama jam-jam biasanya kita bangun. Misalnya, di Ukraina kami memajukan jam satu jam pada hari Minggu terakhir bulan Maret pukul 03. 00 dan kami kembali ke waktu standar [memutar jam mundur satu jam] pada hari Minggu terakhir bulan Oktober pukul 04. 00. Tanggal dan waktu DST mulai dan berakhir bergantung pada negara atau unit politik [mis. g. , Uni Eropa. ]

Selain itu, offset zona waktu wilayah politik dan/atau tanggal dan waktu saat DST dimulai dan diakhiri dapat diubah di beberapa titik dalam riwayat. Oleh karena itu, ada sejumlah database tempat informasi tentang perubahan zona waktu dilacak. Yang paling populer adalah IANA - Basis Data Zona Waktu, juga dikenal sebagai tz atau info zona. Sistem operasi dan perangkat lunak komputer lainnya menggunakan database ini untuk pemrosesan dan konversi zona waktu

Format umum untuk merepresentasikan nilai tanggal dan waktu dalam pemrograman komputer adalah stempel waktu Unix, yang merupakan jumlah detik antara zaman Unix [1 Januari 1970 00. 00. 00 UTC] dan tanggal lainnya [mis. g. , 1620758838]. Bilangan bulat positif mewakili tanggal setelah zaman Unix, sedangkan bilangan bulat negatif mewakili tanggal sebelum zaman Unix

Stempel waktu Unix adalah salah satu format umum untuk menyimpan tanggal dan waktu dalam sistem operasi dan basis data

Pelajari lebih lanjut tentang stempel waktu Unix di Wikipedia. waktu Unix

Pada dasarnya, tanggal JavaScript ditentukan sebagai jumlah milidetik dari 1 Januari 1970 00. 00. 00 UTC. Nomor ini terlihat mirip dengan stempel waktu Unix. Perbedaannya adalah cap waktu Unix adalah jumlah detik sejak zaman Unix sedangkan di JavaScript adalah jumlah milidetik

Dalam JavaScript kami menggunakan objek Tanggal untuk bekerja dengan tanggal dan waktu

const date = new Date[];

Objek Tanggal menyimpan tanggal dan waktu saat ini di UTC secara internal. Namun, secara default, saat kita mengeluarkan tanggal dan waktu, objek Tanggal mengubah keluaran menjadi zona waktu lokal, zona waktu lingkungan tempat kode JavaScript dijalankan [mis. g. , browser, Node. js, dll. ]

Ketika dipakai tanpa parameter, objek tanggal memegang tanggal dan waktu saat ini [

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
3 memegang tanggal saat ini]

Kita dapat mengatur tanggal dan waktu di konstruktor Date atau setelah instantiasi

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC

Saat kami membuat instance kelas Tanggal, tanggal yang ditentukan diubah menjadi dan dilacak di UTC secara internal. Namun, saat kami mengakses tanggal menggunakan metode dasar [mis. g. ,

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
_4,
const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
5,
const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
6, dll] tanggal dikembalikan dalam zona waktu lokal

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
_

Di sini kita membuat instance kelas Tanggal yang menentukan tanggal dalam UTC, tetapi ketika kita mencetak objek tanggal yang dibuat, kita mendapatkan tanggal dalam zona waktu lokal, yang bagi saya adalah UTC+03. 00 [Waktu Musim Panas Eropa Timur]. Jadi, tanggal disimpan dalam UTC secara internal, tetapi saat kami mengakses tanggal menggunakan metode dasar, tanggal tersebut diubah menjadi zona waktu lokal

Metode objek Date yang paling populer adalah

Date.now[];
// number of milliseconds since the Unix Epoch

new Date[].getTime[];
// same

Date.UTC[2021, 4, 14, 0, 0, 0];
// number of milliseconds since the Unix epoch until the specified date

const dateBasedOnUTC = new Date[
  Date.UTC[2021, 4, 14, 0, 0, 0]
];

const date = new Date[];

// Access and modify the date based on local time zone:
date.getFullYear[]; // for example, 2021
date.setFullYear[2021];

date.getMonth[]; // zero-based month index [0 - 11]
date.setMonth[0];

date.getDate[]; // day of the month [1 - 31]
date.setDate[28];

date.getHours[]; // 0 - 23
date.setHours[23];

date.getMinutes[]; // 0 - 59
date.setMinutes[8];

date.getSeconds[]; // 0 - 59
date.setSeconds[59];

// Access and modify the date based on UTC:
date.getUTCFullYear[];
date.setUTCFullYear[2021];

date.getUTCMonth[];
date.setUTCMonth[11];

date.getUTCDate[];
date.setUTCDate[12];

date.getUTCHours[];
date.setUTCHours[9];

date.getUTCMinutes[];
date.setUTCMinutes[0];

date.getUTCSeconds[];
date.setUTCSeconds[0];

// Other useful methods:
date.toISOString[];
// Get the date string in simplified extended ISO format [ISO 8601]

date.toLocaleString['uk', { timeZone: 'UTC' }];
// Get the date string in the format according to a given locale and various options

date.toLocaleString['en', { month: 'long' }];
// Get the name of the month in a given locale [e.g., June, July, etc]

Pelajari lebih lanjut tentang objek Tanggal di MDN Web Docs. Tanggal

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
_

Di sini, kita membuat dua objek tanggal, 11 Mei 2021 dan 12 Mei 2021. Kemudian, kita kurangi 11 Mei 2021 [

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
7] dari 12 Mei 2021 [
const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
8] dan dapatkan selisih 24 jam

Saat Anda bekerja dengan objek tanggal, pertimbangkan zona waktu yang dibuat dengan objek tanggal tersebut. Periksa contoh lain

const date1 = new Date['2021-05-12T00:00:00.000Z']; // ISO 8601 string
const date2 = new Date['12 May 2021 01:00:00 UTC+3'];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 1 or -2?

Di sini, jawabannya adalah -2, karena zona waktu

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
7 adalah UTC sedangkan zona waktu
const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
8 adalah UTC+3. Mari kita lihat apa yang terjadi lebih detail

  1. Kami menetapkan
    const myDate = new Date['11 May 2021 18:30:01 UTC'];
    
    console.log[myDate];
    // Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]
    
    console.log[myDate.getHours[]];
    // 21, not 18 as you might have expected
    _7 hingga 12 Mei 2021 00. 00. 00 UTC menggunakan format ISO 8601. Kami menentukan zona waktu UTC menggunakan karakter Z. Kita juga bisa menentukan zona waktu menggunakan offset, seperti ini. 05-2021-12T00. 00. 00. 000+00. 00 [+00. 00 adalah UTC]
  2. Kami menetapkan
    const myDate = new Date['11 May 2021 18:30:01 UTC'];
    
    console.log[myDate];
    // Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]
    
    console.log[myDate.getHours[]];
    // 21, not 18 as you might have expected
    _8 hingga 12 Mei 2021 01. 00. 00 menggunakan format tanggal dan waktu lain dengan offset zona waktu UTC+3 [atau UTC+03. 00]
  3. Kemudian kita kurangi tanggal1 dari tanggal2 [
    Date.now[];
    // number of milliseconds since the Unix Epoch
    
    new Date[].getTime[];
    // same
    
    Date.UTC[2021, 4, 14, 0, 0, 0];
    // number of milliseconds since the Unix epoch until the specified date
    
    const dateBasedOnUTC = new Date[
      Date.UTC[2021, 4, 14, 0, 0, 0]
    ];
    
    const date = new Date[];
    
    // Access and modify the date based on local time zone:
    date.getFullYear[]; // for example, 2021
    date.setFullYear[2021];
    
    date.getMonth[]; // zero-based month index [0 - 11]
    date.setMonth[0];
    
    date.getDate[]; // day of the month [1 - 31]
    date.setDate[28];
    
    date.getHours[]; // 0 - 23
    date.setHours[23];
    
    date.getMinutes[]; // 0 - 59
    date.setMinutes[8];
    
    date.getSeconds[]; // 0 - 59
    date.setSeconds[59];
    
    // Access and modify the date based on UTC:
    date.getUTCFullYear[];
    date.setUTCFullYear[2021];
    
    date.getUTCMonth[];
    date.setUTCMonth[11];
    
    date.getUTCDate[];
    date.setUTCDate[12];
    
    date.getUTCHours[];
    date.setUTCHours[9];
    
    date.getUTCMinutes[];
    date.setUTCMinutes[0];
    
    date.getUTCSeconds[];
    date.setUTCSeconds[0];
    
    // Other useful methods:
    date.toISOString[];
    // Get the date string in simplified extended ISO format [ISO 8601]
    
    date.toLocaleString['uk', { timeZone: 'UTC' }];
    // Get the date string in the format according to a given locale and various options
    
    date.toLocaleString['en', { month: 'long' }];
    // Get the name of the month in a given locale [e.g., June, July, etc]
    3]. Saat kita menggunakan operasi matematika pada objek, JavaScript mengonversi objek menjadi angka menggunakan metode valueOf[] objek jika ada. Dalam kasus objek Tanggal, metode
    Date.now[];
    // number of milliseconds since the Unix Epoch
    
    new Date[].getTime[];
    // same
    
    Date.UTC[2021, 4, 14, 0, 0, 0];
    // number of milliseconds since the Unix epoch until the specified date
    
    const dateBasedOnUTC = new Date[
      Date.UTC[2021, 4, 14, 0, 0, 0]
    ];
    
    const date = new Date[];
    
    // Access and modify the date based on local time zone:
    date.getFullYear[]; // for example, 2021
    date.setFullYear[2021];
    
    date.getMonth[]; // zero-based month index [0 - 11]
    date.setMonth[0];
    
    date.getDate[]; // day of the month [1 - 31]
    date.setDate[28];
    
    date.getHours[]; // 0 - 23
    date.setHours[23];
    
    date.getMinutes[]; // 0 - 59
    date.setMinutes[8];
    
    date.getSeconds[]; // 0 - 59
    date.setSeconds[59];
    
    // Access and modify the date based on UTC:
    date.getUTCFullYear[];
    date.setUTCFullYear[2021];
    
    date.getUTCMonth[];
    date.setUTCMonth[11];
    
    date.getUTCDate[];
    date.setUTCDate[12];
    
    date.getUTCHours[];
    date.setUTCHours[9];
    
    date.getUTCMinutes[];
    date.setUTCMinutes[0];
    
    date.getUTCSeconds[];
    date.setUTCSeconds[0];
    
    // Other useful methods:
    date.toISOString[];
    // Get the date string in simplified extended ISO format [ISO 8601]
    
    date.toLocaleString['uk', { timeZone: 'UTC' }];
    // Get the date string in the format according to a given locale and various options
    
    date.toLocaleString['en', { month: 'long' }];
    // Get the name of the month in a given locale [e.g., June, July, etc]
    _4 mengembalikan tanggal dan waktu sebagai jumlah milidetik sejak zaman Unix, yang merupakan representasi tanggal dan waktu berbasis UTC. Jadi,
    const myDate = new Date['11 May 2021 18:30:01 UTC'];
    
    console.log[myDate];
    // Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]
    
    console.log[myDate.getHours[]];
    // 21, not 18 as you might have expected
    _7 telah ditetapkan dalam UTC, sedangkan
    const myDate = new Date['11 May 2021 18:30:01 UTC'];
    
    console.log[myDate];
    // Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]
    
    console.log[myDate.getHours[]];
    // 21, not 18 as you might have expected
    8 telah diubah menjadi UTC dari UTC+3. Jadi, sebenarnya kita kurangi 12 Mei 2021 dengan 01. 00. 00 UTC [
    const myDate = new Date['11 May 2021 18:30:01 UTC'];
    
    console.log[myDate];
    // Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]
    
    console.log[myDate.getHours[]];
    // 21, not 18 as you might have expected
    _7] mulai 11 Mei 2021 22. 00. 00 UTC [
    const myDate = new Date['11 May 2021 18:30:01 UTC'];
    
    console.log[myDate];
    // Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]
    
    console.log[myDate.getHours[]];
    // 21, not 18 as you might have expected
    _8] dan begitulah cara kami mendapatkan -2 untuk hasilnya

Salah satu cara memformat tanggal adalah dengan menggunakan fungsi getter seperti getFullYear, getMonth, getDate, dll. Misalnya, untuk membuat string tanggal dan waktu dalam waktu lokal dalam format 'YYYY-MM-DD hh. mm. ss' kita bisa melakukan hal berikut

const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];

Untuk mendapatkan nilai tanggal dan waktu menurut UTC, kita dapat menggunakan fungsi getter berbasis UTC seperti getUTCFullYear, getUTCMonth, getUTCDate, dll.

Selanjutnya, kita bisa mendapatkan string tanggal dan waktu dari objek Tanggal yang diformat menurut lokal yang diberikan dan berbagai opsi menggunakan metode Tanggal

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
5

new Date['2021-05-16'].toLocaleString['uk'];
// 16.05.2021, 03:00:00

new Date['2021-05-16'].toLocaleString['en', {
  month: 'long',
}];
// May

new Date['2021-05-16'].toLocaleString['en', {
  month: 'long',
  day: 'numeric',
  year: 'numeric',
}];
// May 16, 2021

Harap dicatat bahwa jika Anda tidak menentukan zona waktu dalam opsi,

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
5 akan menampilkan tanggal dalam zona waktu lokal

new Date['2021-05-16T00:00:00'].toLocaleString['en', {
  timeZoneName: 'short', // include the time zone name
}];
// "5/16/2021, 12:00:00 AM GMT+3" [GMT+3 is my local time zone]

new Date['2021-05-16T00:00:00'].toLocaleString['en', {
  timeZoneName: 'short',
  timeZone: 'Europe/Amsterdam',
}];
// 5/15/2021, 11:00:00 PM GMT+2

Pertama, kita membuat instance objek Date dengan zona waktu lokal dan mendapatkan string tanggal dan waktu yang dilokalkan. Ketika Tanggal ditetapkan, nilai tanggal dan waktu diubah secara internal dari zona waktu yang ditentukan [atau zona waktu lokal jika zona waktu tidak ditentukan] ke UTC

Kemudian, kami membuat instance objek Date lainnya dengan zona waktu lokal. Kali ini kami menyetel opsi

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
1 ke "Eropa/Amsterdam" [menurut Database Zona Waktu IANA]. Oleh karena itu, kami mendapatkan string tanggal dan waktu yang dilokalkan berdasarkan zona waktu "Eropa/Amsterdam". Lebih detail. zona waktu saya saat ini adalah UTC+3, jadi objek Tanggal dibuat dengan tanggal dan waktu 16-05-2021 00. 00. 00 UTC+3 yang diubah menjadi UTC secara internal dan menjadi 15-05-2021 21. 00. 00. Kemudian, metode
const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
_5 mengubah tanggal ini dari UTC menjadi "Eropa/Amsterdam" dan hasilnya adalah 15/5/2021, 11. 00. 00 PM GMT+2. Offset yang dihasilkan adalah +2, karena merupakan offset Waktu Musim Panas dari zona waktu "Eropa/Amsterdam"

Biasanya, perangkat lunak komputer [mis. g. , Node. js, database, dll] secara default menggunakan konfigurasi tanggal dan waktu sistem. Oleh karena itu, pastikan semua server milik aplikasi Anda menggunakan zona waktu yang sama. UTC umumnya digunakan

Di Linux Anda dapat memeriksa zona waktu menggunakan salah satu dari perintah berikut

date
date +"%Z %z"
timedatectl

Untuk mengubah zona waktu sistem Anda dapat menggunakan perintah berikut

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
0

Untuk memeriksa zona waktu Node. proses js

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
1

Di Node. js Anda dapat mengatur zona waktu menggunakan variabel lingkungan

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
3

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
2

Jika variabel

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
_3 tidak disetel, Node. js akan mencoba menggunakan zona waktu sistem operasi

Biasanya, aplikasi web tersedia dari mana saja di seluruh dunia. Artinya, jika kita menyimpan tanggal dalam database, kita perlu memastikan bahwa kita menyimpan semua tanggal dalam satu zona waktu [konsisten] atau setidaknya melacak zona waktu dari tanggal yang kita simpan. Berbagai database memiliki kekhususan tentang bagaimana mereka memperlakukan nilai tanggal dan waktu. Jadi, di bagian ini saya ingin menjelaskan secara singkat cara menyimpan nilai tanggal dan waktu di database yang berbeda dan menyebutkan beberapa hal spesifik tersebut

Biasanya, perangkat lunak [terutama aplikasi web] melayani pengguna dari seluruh dunia. Waktu lokal setiap pengguna bergantung pada lokasi mereka. Misalnya, untuk pengguna dari Kyiv waktu setempat di musim panas adalah 17. 00 dan pada saat yang sama untuk pengguna di Amsterdam waktu setempat adalah 16. 00

Pada dasarnya, kita harus mengonversi dan menyimpan tanggal dalam zona waktu terpadu; . Jadi, sebelum menyimpan tanggal, kita harus mengonversinya dari waktu setempat ke UTC. Misalnya, pengguna dari Amsterdam membuat pengingat di aplikasi kalender. Pengguna memilih tanggal dan waktu pengingat dalam waktu setempat [zona waktu "Eropa/Amsterdam" - UTC+01. 00 waktu standar dan UTC+02. 00 DST]. Katakanlah pengguna menyetel tanggal pengingat menjadi 12 Mei 2021 17. 00 menggunakan widget kalender. Sekarang, sebelum kita menyimpan tanggal ini di database, kita harus mengubahnya menjadi UTC, dan tanggalnya menjadi. 12 Mei 2021 15. 00 di UTC, karena Daylight Saving Time di Amsterdam [UTC+02. 00] mulai aktif pada 28 Maret 2021 pukul 02. 00. 00. Untungnya, kami biasanya tidak harus berurusan dengan logika konversi zona waktu, karena biasanya dibuat dalam bahasa pemrograman dan perangkat lunak [mis. g. , database] yang kami gunakan. Misalnya, dalam JavaScript kita bisa mendapatkan tanggal dan waktu saat ini di UTC menggunakan objek Tanggal

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
_3

MySQL

Di MySQL, tanggal biasanya disimpan menggunakan tipe kolom

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
5 dan
const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
6

URUTAN WAKTU MySQL

MySQL mengonversi

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
_6 nilai dari zona waktu saat ini [mis. g. , zona waktu global atau zona waktu sesi klien] ke UTC untuk penyimpanan, dan kembali dari UTC ke zona waktu saat ini untuk pengambilan. MySQL tidak melakukan ini dengan tipe kolom lainnya, seperti
const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
5. Jadi,
const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
_6 nilai dikonversi ke UTC untuk penyimpanan, tetapi ketika diambil, nilai tersebut dikonversi ke zona waktu saat ini [
const date1 = new Date['2021-05-12T00:00:00.000Z']; // ISO 8601 string
const date2 = new Date['12 May 2021 01:00:00 UTC+3'];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 1 or -2?
0]. Silakan periksa contoh ini

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
_4

Pada MySQL 8. 0. 19 kita dapat menambahkan offset zona waktu saat memasukkan nilai

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
6 dan
const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
5 ke dalam tabel

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
5

Mari kita lihat apa yang terjadi dalam contoh ini

  1. Kami menetapkan zona waktu saat ini ke UTC+2
  2. Kami memasukkan nilai tanggal dengan zona waktu offset UTC-1. 12-05-2021 21. 00. 00-01. 00. MySQL mengonversi nilai tanggal dan waktu ini dari UTC-1 ke UTC untuk penyimpanan. 12-05-2021 22. 00. 00
  3. Kami memilih baris dari tabel kami dan MySQL mengonversi
    const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
    const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
    const diffInMilliseconds = date2 - date1;
    const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
    console.log[diffInHours]; // 24
    6 nilai dari UTC ke zona waktu saat ini [UTC+2] setelah pengambilan. 13-05-2021 00. 00. 00
  4. Kemudian, kami menyetel zona waktu ke UTC+3 dan memilih baris lagi, dan karena MySQL mengonversi nilai
    const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
    const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
    const diffInMilliseconds = date2 - date1;
    const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
    console.log[diffInHours]; // 24
    6 dari UTC ke zona waktu saat ini setelah pengambilan, kami mendapatkan tanggal yang telah kami masukkan sebelumnya di UTC+3 kali ini. 13-05-2021 01. 00. 00

Tipe

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
6 memiliki rentang 1970-01-01 00. 00. 01 UTC sampai 19-01-2038 03. 14. 07 UTC

MySQL DATETIME

MySQL

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
_5 disimpan dan diambil apa adanya

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
6

MySQL tidak mengonversi

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
5 nilai dari zona waktu saat ini ke UTC dan sebaliknya

Namun, sesuatu yang menarik terjadi saat kita menyisipkan nilai

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
5 dengan offset zona waktu

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
7

Pada contoh di atas kita dapat melihat bahwa ketika kita memasukkan nilai

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
5 dengan offset zona waktu, MySQL mengubah nilai tanggal ini menjadi zona waktu saat ini untuk penyimpanan. 12-05-2021 21. 00. 00+00. 00 + offset zona waktu saat ini [+03. 00] = 13-05-2021 00. 00. 00

Tipe

const date1 = new Date[Date.UTC[2021, 4, 11, 0, 0, 0]];
const date2 = new Date[Date.UTC[2021, 4, 12, 0, 0, 0]];
const diffInMilliseconds = date2 - date1;
const diffInHours = diffInMilliseconds / 1000 / 60 / 60;
console.log[diffInHours]; // 24
5 memiliki rentang 1000-01-01 00. 00. 00 hingga 9999-12-31 23. 59. 59

Untuk menyimpan nilai tanggal dan waktu, saya akan mengonversi nilai tanggal dan waktu lokal ke UTC dalam kode aplikasi dan menyimpan nilai ini di kolom DATETIME. Pada dasarnya, saya akan menangani konversi zona waktu di sisi aplikasi dan menyimpan semua tanggal di UTC. Saya akan menggunakan DATETIME daripada TIMESTAMP, karena TIMESTAMP sebenarnya adalah bilangan bulat 32 bit dan tidak memungkinkan untuk menyimpan tanggal di luar 2038-01-19 03. 14. 07 UTC, sementara DATETIME memungkinkan kita menyimpan tanggal hingga 31-9999-12-31 23. 59. 59. 999999

PostgreSQL

Di PostgreSQL kami biasanya menyimpan nilai tanggal dan waktu menggunakan tipe kolom

const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
1 [atau cukup
const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
2] atau
const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
3 [atau cukup
const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
4]. Kedua jenis tersebut memiliki kisaran tahun 4713 SM hingga 294276 Masehi

Stempel waktu PostgreSQL tanpa zona waktu

Nilai

const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
_1 disimpan dan diambil apa adanya

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
_8

Dalam contoh ini, kami membuat kolom

const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
_1 bernama created_at. Dan, kita dapat dengan jelas melihat bahwa nilai tanggal dan waktu disimpan dan diambil dari kolom ini sebagaimana adanya. Jika kita menentukan zona waktu, zona waktu akan diabaikan

Stempel waktu PostgreSQL dengan zona waktu

Nilai

const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
_3 [
const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
4] dikonversi dari zona waktu yang ditentukan ke UTC. Jika Anda tidak menentukan zona waktu saat memasukkan nilai
const date = new Date[];
const year = date.getFullYear[];
const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
const day = date.getDate[]; // 0 - 31
const hours = date.getHours[]; // 0 - 23
const minutes = date.getMinutes[]; // 0 - 59
const seconds = date.getSeconds[]; // 0 - 59

const addZero = [num] => `${num}`.padStart[2, '0'];

const formatted =
  year +
  '-' +
  addZero[month + 1] +
  '-' +
  addZero[day] +
  ' ' +
  addZero[hours] +
  ':' +
  addZero[minutes] +
  ':' +
  addZero[seconds];
4, PostgreSQL akan menganggap bahwa nilai tanggal ini didasarkan pada zona waktu saat ini [
new Date['2021-05-16'].toLocaleString['uk'];
// 16.05.2021, 03:00:00

new Date['2021-05-16'].toLocaleString['en', {
  month: 'long',
}];
// May

new Date['2021-05-16'].toLocaleString['en', {
  month: 'long',
  day: 'numeric',
  year: 'numeric',
}];
// May 16, 2021
0]

let currentDate = new Date[];
let someDate = new Date['December 12, 2020 18:30:01'];
let someDate = new Date['2021-12-12T18:30:01'];
let someDate = new Date[2021, 11, 12, 18, 30, 1]; // Month's index is zero-based
let someDate = new Date[1639326601000]; // Number of milliseconds from Jan 1, 1970 00:00:00 UTC
_9

Apa yang terjadi dalam contoh ini adalah sebagai berikut

  1. Kami membuat tabel dengan kolom bernama create_at yang bertipe
    const date = new Date[];
    const year = date.getFullYear[];
    const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
    const day = date.getDate[]; // 0 - 31
    const hours = date.getHours[]; // 0 - 23
    const minutes = date.getMinutes[]; // 0 - 59
    const seconds = date.getSeconds[]; // 0 - 59
    
    const addZero = [num] => `${num}`.padStart[2, '0'];
    
    const formatted =
      year +
      '-' +
      addZero[month + 1] +
      '-' +
      addZero[day] +
      ' ' +
      addZero[hours] +
      ':' +
      addZero[minutes] +
      ':' +
      addZero[seconds];
    3
  2. Kami menyetel zona waktu saat ini untuk sesi ke UTC+3. Harap dicatat, bahwa di PostgreSQL kita dapat menentukan zona waktu saat ini menggunakan offset bilangan bulat atau nama zona waktu [mis. g. , Amerika/New_York]. Untuk mendapatkan daftar nama zona waktu yang didukung, kueri tabel pg_timezone_names.
    new Date['2021-05-16'].toLocaleString['uk'];
    // 16.05.2021, 03:00:00
    
    new Date['2021-05-16'].toLocaleString['en', {
      month: 'long',
    }];
    // May
    
    new Date['2021-05-16'].toLocaleString['en', {
      month: 'long',
      day: 'numeric',
      year: 'numeric',
    }];
    // May 16, 2021
    2
  3. Kami memastikan bahwa offset zona waktu telah diatur dengan benar
  4. Kami menyisipkan baris dengan nilai create_at dari 2021-05-12 09. 00. 00 +01. 00 ke tabel baru. Karena kolom create_at bertipe
    const date = new Date[];
    const year = date.getFullYear[];
    const month = date.getMonth[]; // getMonth returns a zero-based index of the month: 0-11
    const day = date.getDate[]; // 0 - 31
    const hours = date.getHours[]; // 0 - 23
    const minutes = date.getMinutes[]; // 0 - 59
    const seconds = date.getSeconds[]; // 0 - 59
    
    const addZero = [num] => `${num}`.padStart[2, '0'];
    
    const formatted =
      year +
      '-' +
      addZero[month + 1] +
      '-' +
      addZero[day] +
      ' ' +
      addZero[hours] +
      ':' +
      addZero[minutes] +
      ':' +
      addZero[seconds];
    3, PostgreSQL mengonversi nilai tanggal dari zona waktu yang ditentukan [+01. 00 dalam kasus kami] ke UTC untuk penyimpanan. Jadi, nilai yang sebenarnya disimpan adalah "2021-05-12 08. 00. 00"
  5. Kami memilih baris yang disisipkan dari tabel dan nilai tanggal diubah dari UTC ke offset zona waktu saat ini, yaitu UTC+3
  6. Kami memasukkan baris lain ke dalam tabel, tetapi kali ini tanpa menentukan offset zona waktu. Jika kami tidak menyertakan offset zona waktu, PostgreSQL mengasumsikan bahwa nilai tanggal yang kami berikan didasarkan pada zona waktu saat ini, yang dalam kasus kami adalah UTC+3. Jadi, sebelum menyimpan nilai tanggal ini, PostgreSQL akan mengonversinya dari zona waktu saat ini [UTC+3 dalam kasus kita] menjadi UTC, dan nilai tanggal berikut akan disimpan. 12-05-2021 06. 00. 00 UTC
  7. Akhirnya kami memilih semua baris dari tabel kami lagi dan melihat bahwa nilai tanggal yang baru saja kami sisipkan ditampilkan di zona waktu saat ini. 12-05-2021 09. 00. 00+03

Untuk menyimpan nilai tanggal dan waktu di PostgreSQL saya akan menggunakan tipe

new Date['2021-05-16'].toLocaleString['uk'];
// 16.05.2021, 03:00:00

new Date['2021-05-16'].toLocaleString['en', {
  month: 'long',
}];
// May

new Date['2021-05-16'].toLocaleString['en', {
  month: 'long',
  day: 'numeric',
  year: 'numeric',
}];
// May 16, 2021
4. Pada dasarnya, saya akan memilih timestamptz daripada timestamp, karena alasan yang disebutkan dalam artikel berikut dari Wiki PostgreSQL.

DynamoDB

Anda dapat menggunakan tipe data string dan angka untuk menyimpan tanggal dan stempel waktu. Kita dapat menggunakan tipe data string untuk menyimpan nilai tanggal dan waktu dalam format ISO 8601 [mis. g. , 12-05-2021, 05-05-2021-12T21. 00. 59. 123Z]. Dan kita dapat menggunakan tipe data angka untuk menyimpan nilai tanggal dan waktu sebagai stempel waktu UNIX [Epoch time] - sejumlah detik sejak 1 Januari 1970 00. 00. 00 UTC. Ini akan memungkinkan kami untuk mengurutkan dan menanyakan item berdasarkan tanggal dan waktu

MongoDB

Di MongoDB, secara internal, tanggal disimpan sebagai bilangan bulat bertanda 64-bit yang mewakili sejumlah milidetik sejak zaman Unix [1 Januari 1970 00. 00. 00 UTC]. Nilai negatif mewakili tanggal sebelum zaman Unix

Untuk menyisipkan tanggal di shell Mongo, kita bisa menggunakan objek Date

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
_0

Anda dapat melewatkan string ISO 8601 atau beberapa milidetik sejak zaman Unix ke konstruktor Tanggal

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
_1

Jika Anda menentukan offset zona waktu, tanggal akan dikonversi ke UTC

const myDate = new Date['11 May 2021 18:30:01 UTC'];

console.log[myDate];
// Tue May 11 2021 21:30:01 GMT+0300 [Eastern European Summer Time]

console.log[myDate.getHours[]];
// 21, not 18 as you might have expected
_2

Kesimpulan

Berhati-hatilah saat bekerja dengan tanggal dan waktu. Selalu periksa apakah tanggal yang Anda simpan dan kerjakan didasarkan pada zona waktu yang Anda harapkan. Pastikan bahwa lingkungan yang Anda gunakan untuk menjalankan berbagai bagian aplikasi Anda [mis. g. , server web, database, dll. ] memiliki konfigurasi zona waktu yang benar dan konsisten

Apakah Tanggal JavaScript menangani penghematan siang hari?

Jawabannya adalah Ya. Jika kita mempertimbangkan New York, AS, maka selama Daylight Saving, offsetnya adalah -4, sedangkan sebaliknya -5. Ada solusi untuk ini juga. fungsi tambahan saat mendapatkan offset UTC kota tujuan .

Bagaimana Anda menangani DST?

Saya merekomendasikan tips ini untuk mengelola transisi ke waktu musim panas. Tidur 15 menit lebih awal, mulai beberapa hari sebelum perubahan, dan tingkatkan 15 menit setiap beberapa malam . Berusahalah ekstra untuk beristirahat dengan baik seminggu sebelum waktu berubah.

Bagaimana cara menangani zona waktu yang berbeda dalam JavaScript?

Metode JavaScript getTimezoneOffset[] digunakan untuk menemukan offset zona waktu . Ini mengembalikan perbedaan zona waktu dalam menit, antara UTC dan waktu lokal saat ini.

Bagaimana cara mendapatkan waktu offset dalam JavaScript?

Tanggal JavaScript getTimezoneOffset[] . getTimezoneOffset[] mengembalikan perbedaan dalam hitungan menit. Misalnya, jika zona waktu Anda adalah GMT+2, -120 akan dikembalikan.

Bài mới nhất

Chủ Đề