Apakah ada cara standar untuk server web untuk dapat menentukan zona waktu pengguna dalam halaman web?
Mungkin dari header HTTP atau bagian dari user-agent
string?
html
browser
timezone
user-agent
timezone-offset
Kevin Dente
sumber
sumber
Jawaban:
Metode ini
getTimezoneOffset()
akan mengurangi waktu Anda dari GMT dan mengembalikan jumlah menit. Jadi jika Anda tinggal di GMT-8, itu akan mengembalikan 480.Untuk menghitungnya menjadi berjam-jam, bagi dengan 60. Selain itu, perhatikan bahwa tandanya adalah kebalikan dari yang Anda butuhkan - itu menghitung offset GMT dari zona waktu Anda, bukan offset zona waktu Anda dari GMT. Untuk memperbaikinya, cukup kalikan dengan -1.
Perhatikan juga bahwa w3school mengatakan:
sumber
>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
Cara paling populer (== standar?) Untuk menentukan zona waktu yang pernah saya lihat adalah bertanya pada pengguna sendiri. Jika situs web Anda memerlukan berlangganan, ini dapat disimpan dalam data profil pengguna. Untuk pengguna lain, tanggal dapat ditampilkan sebagai UTC atau GMT atau semacamnya.
Saya tidak berusaha menjadi orang yang cerdas. Hanya saja kadang-kadang beberapa masalah memiliki solusi yang lebih baik di luar konteks pemrograman apa pun.
sumber
Tidak ada header HTTP yang akan melaporkan zona waktu klien sejauh ini meskipun telah disarankan untuk memasukkannya dalam spesifikasi HTTP.
Jika itu saya, saya mungkin akan mencoba mengambil zona waktu menggunakan JavaScript di sebelah klien dan kemudian mengirimkannya ke server menggunakan Ajax atau sesuatu.
sumber
JavaScript adalah cara termudah untuk mendapatkan waktu lokal klien. Saya akan menyarankan menggunakan XMLHttpRequest untuk mengirim kembali waktu setempat, dan jika itu gagal, kembali ke zona waktu yang terdeteksi berdasarkan alamat IP mereka.
Sejauh geolokasi, saya telah menggunakan MaxMind GeoIP pada beberapa proyek dan berfungsi dengan baik, meskipun saya tidak yakin apakah mereka menyediakan data zona waktu. Ini adalah layanan yang Anda bayar dan mereka memberikan pembaruan bulanan ke database Anda. Mereka menyediakan pembungkus dalam beberapa bahasa web.
sumber
Pertama, pahami bahwa deteksi zona waktu dalam JavaScript tidak sempurna. Anda bisa mendapatkan offset zona waktu lokal untuk tanggal dan waktu tertentu menggunakan
getTimezoneOffset
instanceDate
objek, tapi itu tidak sama dengan zona waktu IANA penuh sepertiAmerica/Los_Angeles
.Ada beberapa opsi yang dapat bekerja:
Hasilnya adalah string yang berisi pengaturan zona waktu IANA dari komputer tempat kode berjalan.
Lingkungan yang didukung tercantum dalam tabel kompatibilitas Intl . Buka
DateTimeFormat
bagian itu, dan lihat fitur yang dinamairesolvedOptions().timeZone defaults to the host environment
.Beberapa perpustakaan, seperti Luxon menggunakan API ini untuk menentukan zona waktu melalui fungsi-fungsi seperti
luxon.Settings.defaultZoneName
.Intl
API jika tersedia, dan ketika itu tidak tersedia, mereka menginterogasigetTimezoneOffset
fungsiDate
objek, untuk beberapa titik waktu yang berbeda, menggunakan hasil untuk memilih zona waktu yang sesuai dari set data internal.Baik jsTimezoneDetect dan moment-timezone memiliki fungsi ini.
Dalam kedua kasus, hasilnya hanya dapat dianggap sebagai tebakan. Dugaan itu mungkin benar dalam banyak kasus, tetapi tidak semuanya.
Selain itu, perpustakaan ini harus diperbarui secara berkala untuk melawan fakta bahwa banyak implementasi JavaScript yang lebih tua hanya menyadari saat daylight saving waktu aturan untuk zona waktu lokal mereka. Lebih detail tentang itu di sini.
Pada akhirnya, pendekatan yang lebih baik adalah menanyakan zona waktu mereka kepada pengguna Anda. Berikan pengaturan yang bisa diubah. Anda dapat menggunakan salah satu opsi di atas untuk memilih pengaturan default , tetapi jangan membuatnya mustahil untuk menyimpang dari itu di aplikasi Anda.
Ada juga pendekatan yang sama sekali berbeda dari tidak bergantung pada pengaturan zona waktu komputer pengguna sama sekali. Alih-alih, jika Anda bisa mengumpulkan koordinat garis lintang dan bujur, Anda bisa menyelesaikannya ke zona waktu menggunakan salah satu metode ini . Ini berfungsi baik di perangkat seluler.
sumber
Berikut ini adalah solusi JavaScript yang tangguh untuk menentukan zona waktu di mana browser berada.
https://bitbucket.org/pellepim/jstimezonedetect
Lampiran 1: Sekarang proyek ini terletak di GitHub: https://github.com/pellepim/jstimezonedetect
sumber
Ini cara yang lebih lengkap.
Kutipan di bawah ini:
Mendapatkan TZ dan DST dari JS (via Way Back Machine)
sumber
Africa/Johannesburg
atauEurope/Istanbul
. Lihat wiki tag zona waktu .Menggunakan pendekatan Unkwntech, saya menulis sebuah fungsi menggunakan jQuery dan PHP. Ini diuji dan berhasil!
Pada halaman PHP tempat Anda ingin memiliki zona waktu sebagai variabel, minta potongan kode ini di suatu tempat dekat bagian atas halaman:
Ini akan membaca variabel sesi "waktu", yang sekarang akan kita buat.
Pada halaman yang sama, di <head>, Anda harus memasukkan jQuery:
Juga di <head>, di bawah jQuery, rekatkan ini:
Anda mungkin atau mungkin tidak memperhatikan, tetapi Anda perlu mengubah URL ke domain Anda yang sebenarnya.
Satu hal terakhir. Anda mungkin bertanya-tanya apa itu timezone.php. Ya begini saja: (buat file baru bernama timezone.php dan arahkan ke sana dengan URL di atas)
Jika ini berfungsi dengan benar, pertama-tama akan memuat halaman, menjalankan JavaScript, dan memuat kembali halaman. Anda kemudian dapat membaca variabel $ timezone dan menggunakannya untuk kesenangan Anda! Ini mengembalikan offset zona waktu UTC / GMT saat ini (GMT -7) atau zona waktu apa pun Anda berada.
sumber
Untuk mengirim offset zona waktu sebagai header HTTP pada permintaan AJAX dengan jQuery
Anda juga dapat melakukan hal serupa untuk mendapatkan nama zona waktu yang sebenarnya dengan menggunakan
moment.tz.guess();
dari http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/sumber
Saya masih belum melihat jawaban terperinci di sini yang mendapatkan zona waktu. Anda tidak perlu melakukan geocode berdasarkan alamat IP atau menggunakan PHP (lol) atau menebak secara salah dari offset.
Pertama, zona waktu bukan hanya offset dari GMT. Ini adalah area tanah di mana aturan waktu ditetapkan oleh standar lokal. Beberapa negara memiliki penghematan siang hari, dan akan mengaktifkan DST pada waktu yang berbeda. Biasanya penting untuk mendapatkan zona aktual, bukan hanya offset saat ini.
Jika Anda bermaksud menyimpan zona waktu ini, misalnya dalam preferensi pengguna, Anda menginginkan zona dan bukan hanya offset. Untuk konversi waktu nyata itu tidak masalah.
Sekarang, untuk mendapatkan zona waktu dengan javascript Anda dapat menggunakan ini:
Namun saya merasa lebih mudah untuk menggunakan plugin yang kuat ini yang mengembalikan zona waktu diformat Olsen:
https://github.com/scottwater/jquery.detect_timezone
sumber
Dengan PHP
date
fungsi Anda akan mendapatkan tanggal waktu server tempat situs tersebut berada. Satu-satunya cara untuk mendapatkan waktu pengguna adalah menggunakan JavaScript.Tetapi saya menyarankan Anda untuk, jika situs Anda memiliki pendaftaran yang diperlukan maka cara terbaik adalah meminta pengguna sementara untuk memiliki pendaftaran sebagai bidang wajib. Anda dapat membuat daftar berbagai zona waktu di halaman register dan menyimpannya dalam database. Setelah ini, jika pengguna masuk ke situs maka Anda dapat mengatur zona waktu default untuk sesi itu sesuai zona waktu yang dipilih pengguna.
Anda dapat mengatur zona waktu tertentu menggunakan fungsi PHP
date_default_timezone_set
. Ini menetapkan zona waktu yang ditentukan untuk pengguna.Pada dasarnya zona waktu pengguna adalah ke sisi klien, jadi kita harus menggunakan JavaScript untuk ini.
Di bawah ini adalah skrip untuk mendapatkan zona waktu pengguna menggunakan PHP dan JavaScript.
Tetapi sesuai dengan sudut pandang saya, lebih baik bertanya kepada pengguna apakah pendaftaran wajib untuk proyek Anda.
sumber
Jangan gunakan alamat IP untuk menentukan lokasi secara definitif (dan karenanya zona waktu) - itu karena dengan NAT, proksi (semakin populer), dan VPN, alamat IP tidak selalu secara realistis mencerminkan lokasi sebenarnya pengguna, tetapi lokasi di mana server yang mengimplementasikan protokol tersebut berada.
Mirip dengan bagaimana kode area AS tidak lagi berguna untuk mencari pengguna telepon, mengingat popularitas portabilitas angka.
Alamat IP dan teknik lain yang ditunjukkan di atas berguna untuk menyarankan default yang dapat disesuaikan / diperbaiki pengguna.
sumber
JavaScript:
Cukup sediakan waktu Anda dalam format cap waktu Unix untuk fungsi ini; JavaScript sudah mengetahui zona waktu pengguna.
Seperti ini:
PHP:
Ini akan selalu menunjukkan waktu dengan benar berdasarkan zona waktu yang telah ditetapkan pada jam komputernya. Tidak perlu meminta apa pun kepada siapa pun dan menyimpannya di tempat, terima kasih Tuhan!
sumber
Mudah, cukup gunakan
getTimezoneOffset
fungsi JavaScript seperti ini:sumber
Tampaknya semua keajaiban ada di
Itu keren, saya tidak tahu tentang itu. Apakah itu berfungsi di Internet Explorer, dll? Dari sana Anda harus dapat menggunakan JavaScript untuk Ajax, mengatur cookie, apa pun. Saya mungkin akan pergi rute cookie sendiri.
Anda harus mengizinkan pengguna untuk mengubahnya. Kami mencoba menggunakan geolokasi (melalui maxmind) untuk melakukan ini beberapa waktu yang lalu, dan itu cukup sering salah - cukup untuk membuatnya tidak layak dilakukan, jadi kami hanya membiarkan pengguna mengaturnya di profil mereka, dan menunjukkan pemberitahuan kepada pengguna yang belum mengaturnya.
sumber
Berikut ini adalah artikel (dengan kode sumber) yang menjelaskan cara menentukan dan menggunakan waktu lokal dalam aplikasi ASP.NET (VB.NET, C #):
Ini tentang waktu
Singkatnya, pendekatan yang dijelaskan bergantung pada
getTimezoneOffset
fungsi JavaScript , yang mengembalikan nilai yang disimpan dalam cookie sesi dan digunakan oleh kode-belakang untuk menyesuaikan nilai waktu antara GMT dan waktu lokal. Yang menyenangkan adalah bahwa pengguna tidak perlu menentukan zona waktu (kode melakukannya secara otomatis). Ada yang lebih terlibat (ini sebabnya saya menautkan ke artikel), tetapi kode yang disediakan membuatnya sangat mudah digunakan. Saya menduga Anda dapat mengonversi logika ke PHP dan bahasa lain (selama Anda memahami ASP.NET).sumber
Jika Anda menggunakan OpenID untuk otentikasi, Ekstensi Pendaftaran Sederhana akan menyelesaikan masalah bagi pengguna yang diautentikasi (Anda harus mengonversi dari tz ke numerik).
Pilihan lain adalah menyimpulkan zona waktu dari preferensi negara agen pengguna. Ini adalah metode yang agak kasar (tidak akan bekerja untuk en-AS), tetapi membuat perkiraan yang baik.
sumber
Sederhana dengan JavaScript dan PHP:
Meskipun pengguna dapat mengacaukan jam internal dan / atau zona waktu, cara terbaik yang saya temukan sejauh ini, untuk mendapatkan offset, tetap ada
new Date().getTimezoneOffset();
. Ini non-invasif, tidak membuat kepala pusing dan menghilangkan kebutuhan untuk mengandalkan pihak ketiga.Katakanlah saya punya tabel
users
,, yang berisi bidangdate_created int(13)
, untuk menyimpan cap waktu Unix;Dengan asumsi klien
creates a new account
, data yang diterima olehpost
, dan saya perluinsert/update
yangdate_created column
dengan klien Unix timestamp, bukan server.Karena timezoneOffset diperlukan pada saat memasukkan / memperbarui, ia dilewatkan sebagai elemen $ _POST tambahan ketika klien mengirimkan formulir, sehingga menghilangkan kebutuhan untuk menyimpannya dalam sesi dan / atau cookie, dan tidak ada tambahan server yang memukul.
Katakanlah server menerima
tzo
sebagai$_POST['tzo']
;Sisipkan / perbarui
date_created=$user_timestamp
.Saat mengambil date_created, Anda dapat mengonversi timestamp seperti:
Sekarang, contoh ini mungkin sesuai dengan kebutuhan seseorang, ketika harus memasukkan
first
stempel waktu ... Ketika datang ke stempel waktu tambahan, atau tabel, Anda mungkin ingin mempertimbangkan memasukkan nilai tzo ke dalam tabel pengguna untuk referensi di masa mendatang, atau mengaturnya sebagai sesi atau sebagai cookie.PS TAPI bagaimana jika pengguna melakukan perjalanan dan mengganti zona waktu. Masuk pada GMT + 4, bergerak cepat ke GMT-1 dan masuk lagi. Login terakhir akan di masa depan.
Saya pikir ... kami terlalu banyak berpikir.
sumber
Anda bisa melakukannya pada klien dengan moment-timezone dan mengirim nilai ke server; penggunaan sampel:
sumber
Mendapatkan nama zona waktu TZ Database yang valid dalam PHP adalah proses dua langkah:
Dengan JavaScript, dapatkan offset zona waktu dalam beberapa menit
getTimezoneOffset
. Offset ini akan positif jika zona waktu lokal di belakang UTC dan negatif jika berada di depan. Jadi, Anda harus menambahkan tanda berlawanan dengan offset.Berikan offset ini ke PHP.
Dalam PHP, ubah offset ini menjadi nama zona waktu yang valid dengan fungsi timezone_name_from_abbr .
Saya telah menulis posting blog di atasnya: Cara Mendeteksi Zona Waktu Pengguna di PHP . Ini juga mengandung demo.
sumber
Intl.DateTimeFormat().resolvedOptions().timeZone
dan mengirimkannya ke server web. Ref: stackoverflow.com/questions/9772955/…Cara mudah untuk melakukannya adalah dengan menggunakan:
sumber
Salah satu opsi yang mungkin adalah dengan menggunakan
Date
bidang header, yang didefinisikan dalam RFC 7231 dan seharusnya mencakup zona waktu. Tentu saja, tidak dijamin bahwa nilainya benar-benar zona waktu klien, tetapi itu bisa menjadi titik awal yang nyaman.sumber
Begini cara saya melakukannya. Ini akan mengatur zona waktu default PHP ke zona waktu lokal pengguna. Cukup rekatkan yang berikut di atas semua halaman Anda:
sumber
Coba kode PHP ini:
sumber