มีวิธีมาตรฐานสำหรับเว็บเซิร์ฟเวอร์เพื่อให้สามารถกำหนดเขตเวลาของผู้ใช้ในหน้าเว็บได้หรือไม่?
อาจมาจากส่วนหัว HTTP หรือส่วนหนึ่งของuser-agent
สตริง?
มีวิธีมาตรฐานสำหรับเว็บเซิร์ฟเวอร์เพื่อให้สามารถกำหนดเขตเวลาของผู้ใช้ในหน้าเว็บได้หรือไม่?
อาจมาจากส่วนหัว HTTP หรือส่วนหนึ่งของuser-agent
สตริง?
คำตอบ:
-new Date().getTimezoneOffset()/60;
วิธีgetTimezoneOffset()
นี้จะลบเวลาของคุณออกจาก GMT และส่งกลับจำนวนนาที ดังนั้นหากคุณอาศัยอยู่ใน GMT-8 มันจะกลับ 480
หากต้องการนำสิ่งนี้เข้าสู่ชั่วโมงให้หารด้วย 60 และสังเกตว่าเครื่องหมายตรงข้ามกับสิ่งที่คุณต้องการ - มันเป็นการคำนวณออฟเซ็ตของ GMT จากเขตเวลาของคุณไม่ใช่ออฟเซ็ตเขตเวลาของคุณจาก GMT ในการแก้ไขปัญหานี้เพียงแค่คูณด้วย -1
โปรดทราบด้วยว่าw3schoolพูดว่า:
ค่าที่ส่งคืนไม่ใช่ค่าคงที่เนื่องจากการฝึกใช้ Daylight Saving Time
>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
วิธีที่นิยมที่สุด (== มาตรฐาน?) วิธีกำหนดเขตเวลาที่ฉันเคยเห็นคือการถามผู้ใช้ หากเว็บไซต์ของคุณต้องการการสมัครสมาชิกข้อมูลนี้อาจถูกบันทึกลงในข้อมูลโปรไฟล์ของผู้ใช้ สำหรับผู้ใช้ anon วันที่สามารถแสดงเป็น UTC หรือ GMT หรือบางอย่าง
ฉันไม่ได้พยายามจะเป็น aleck ที่ฉลาด เป็นเพียงบางครั้งปัญหาที่เกิดขึ้นมีวิธีแก้ปัญหาที่ดีกว่านอกบริบทการเขียนโปรแกรมใด ๆ
ไม่มีส่วนหัว HTTP ที่จะรายงานเขตเวลาของไคลเอ็นต์จนถึงแม้ว่าจะได้รับการแนะนำให้รวมไว้ในข้อกำหนด HTTP
ถ้าเป็นฉันฉันอาจจะพยายามดึงเขตเวลาโดยใช้ JavaScript ไคลเอนต์แล้วส่งไปยังเซิร์ฟเวอร์โดยใช้ Ajax หรือบางอย่าง
JavaScript เป็นวิธีที่ง่ายที่สุดในการรับเวลาท้องถิ่นของลูกค้า ฉันขอแนะนำให้ใช้XMLHttpRequestเพื่อส่งกลับเวลาท้องถิ่นและหากล้มเหลวให้ย้อนกลับไปยังเขตเวลาที่ตรวจพบโดยยึดตามที่อยู่ IP ของพวกเขา
เท่าที่ตำแหน่งทางภูมิศาสตร์ฉันได้ใช้MaxMind GeoIPในหลายโครงการและทำงานได้ดี แต่ฉันไม่แน่ใจว่าพวกเขาให้ข้อมูลเขตเวลาหรือไม่ มันเป็นบริการที่คุณจ่ายและพวกเขาจะทำการอัพเดทฐานข้อมูลของคุณทุกเดือน พวกเขาให้บริการห่อในหลายภาษาเว็บ
ก่อนอื่นให้ทำความเข้าใจว่าการตรวจจับโซนเวลาใน JavaScript นั้นไม่สมบูรณ์ คุณจะได้รับในท้องถิ่นเขตเวลาชดเชยสำหรับวันและเวลาที่ใช้getTimezoneOffset
ในตัวอย่างของการที่Date
วัตถุ แต่ที่ไม่มากเช่นเดียวกับที่เต็มไปด้วยโซนเวลา IANAAmerica/Los_Angeles
เช่น
มีตัวเลือกบางอย่างที่สามารถทำงานได้:
const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tzid);
ผลลัพธ์คือสตริงที่มีการตั้งค่าเขตเวลาของ IANA ของคอมพิวเตอร์ที่มีการเรียกใช้รหัส
สภาพแวดล้อมที่สนับสนุนมีการระบุไว้ในตารางการทำงานร่วมกันสนามบินนานาชาติ ขยายส่วนและมองไปที่คุณลักษณะที่มีชื่อDateTimeFormat
resolvedOptions().timeZone defaults to the host environment
ห้องสมุดบางอย่างเช่นLuxonใช้ API luxon.Settings.defaultZoneName
นี้เพื่อกำหนดเขตเวลาที่ผ่านการทำงานเช่น
Intl
API ครั้งแรกหากมีอยู่และเมื่อไม่พร้อมใช้งานพวกเขาจะสอบถามgetTimezoneOffset
ฟังก์ชันของDate
วัตถุสำหรับจุดต่าง ๆ ในเวลาต่างๆโดยใช้ผลลัพธ์เพื่อเลือกเขตเวลาที่เหมาะสมจากชุดข้อมูลภายในทั้งjsTimezoneDetectและmoment-timezoneมีฟังก์ชันนี้
// using jsTimeZoneDetect
var tzid = jstz.determine().name();
// using moment-timezone
var tzid = moment.tz.guess();
ในทั้งสองกรณีผลลัพธ์จะถือว่าเป็นการคาดเดาเท่านั้น การเดาอาจถูกต้องในหลายกรณี แต่ไม่ใช่ทั้งหมด
นอกจากนี้ไลบรารีเหล่านี้ต้องได้รับการอัปเดตเป็นระยะเพื่อต่อต้านข้อเท็จจริงที่ว่าการใช้งาน JavaScript ที่เก่ากว่าจำนวนมากจะรับรู้เฉพาะกฎการปรับเวลาตามฤดูกาลปัจจุบันสำหรับโซนเวลาท้องถิ่น รายละเอียดเพิ่มเติมเกี่ยวกับที่นี่
ในที่สุดวิธีการที่ดีกว่าคือการขอเขตเวลาให้กับผู้ใช้ของคุณ ระบุการตั้งค่าที่สามารถเปลี่ยนแปลงได้ คุณสามารถใช้หนึ่งในตัวเลือกด้านบนเพื่อเลือกการตั้งค่าเริ่มต้นแต่อย่าทำให้เป็นไปไม่ได้ที่จะเบี่ยงเบนจากที่ตั้งไว้ในแอพของคุณ
นอกจากนี้ยังมีวิธีที่แตกต่างอย่างสิ้นเชิงโดยไม่ต้องพึ่งพาการตั้งค่าโซนเวลาของคอมพิวเตอร์ของผู้ใช้เลย แต่ถ้าคุณสามารถรวบรวมพิกัดละติจูดและลองจิจูดคุณสามารถแก้ไขเหล่านั้นไปยังโซนเวลาโดยใช้วิธีใดวิธีหนึ่งเหล่านี้ สิ่งนี้ทำงานได้ดีบนอุปกรณ์มือถือ
นี่คือโซลูชัน JavaScript ที่มีประสิทธิภาพเพื่อกำหนดเขตเวลาที่เบราว์เซอร์อยู่
>>> var timezone = jstz.determine();
>>> timezone.name();
"Europe/London"
https://bitbucket.org/pellepim/jstimezonedetect
ภาคผนวก 1: ตอนนี้โครงการนี้ตั้งอยู่ที่ GitHub: https://github.com/pellepim/jstimezonedetect
นี่คือวิธีที่สมบูรณ์มากขึ้น
ข้อความที่ตัดตอนมาอยู่ด้านล่าง:
function TimezoneDetect(){
var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
var intMonth;
var intHoursUtc;
var intHours;
var intDaysMultiplyBy;
// Go through each month to find the lowest offset to account for DST
for (intMonth=0;intMonth < 12;intMonth++){
//go to the next month
dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);
// To ignore daylight saving time look for the lowest offset.
// Since, during DST, the clock moves forward, it'll be a bigger number.
if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
intOffset = (dtDate.getTimezoneOffset() * (-1));
}
}
return intOffset;
}
รับ TZ และ DST จาก JS (ผ่านทาง Back Back Machine)
Africa/Johannesburg
Europe/Istanbul
ดูวิกิพีเดียแท็กเขตเวลา
ใช้วิธีของ Unkwntech ฉันเขียนฟังก์ชันโดยใช้ jQuery และ PHP นี่คือการทดสอบและใช้งานได้!
ในหน้า PHP ที่คุณต้องการให้เขตเวลาเป็นตัวแปรให้ใส่โค้ดบางส่วนใกล้กับส่วนบนของหน้า
<?php
session_start();
$timezone = $_SESSION['time'];
?>
นี่จะอ่านตัวแปรเซสชั่น "เวลา" ซึ่งตอนนี้เรากำลังจะสร้าง
ในหน้าเดียวกันใน <head> คุณต้องก่อนอื่นต้องรวม jQuery:
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
นอกจากนี้ใน <head> ใต้ jQuery ให้วางสิ่งนี้:
<script type="text/javascript">
$(document).ready(function() {
if("<?php echo $timezone; ?>".length==0){
var visitortime = new Date();
var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
$.ajax({
type: "GET",
url: "http://example.org/timezone.php",
data: 'time='+ visitortimezone,
success: function(){
location.reload();
}
});
}
});
</script>
คุณอาจหรืออาจไม่ได้สังเกตเห็น แต่คุณต้องเปลี่ยน URL เป็นโดเมนจริงของคุณ
สิ่งสุดท้าย. คุณอาจสงสัยว่า heck timezone.php คืออะไร มันก็แค่นี้: (สร้างไฟล์ใหม่ที่ชื่อว่าtimezone.phpและชี้ไปที่ URL ด้านบน)
<?php
session_start();
$_SESSION['time'] = $_GET['time'];
?>
หากทำงานได้อย่างถูกต้องหน้าแรกจะโหลดหน้าใช้งาน JavaScript และโหลดหน้าเว็บซ้ำ จากนั้นคุณจะสามารถอ่านตัวแปร $ timezone และใช้เพื่อความสุขของคุณ! จะคืนค่าออฟเซ็ต UTC / GMT เขตเวลาปัจจุบัน (GMT -7) หรือเขตเวลาใด ๆ ที่คุณอยู่
ในการส่งเขตเวลาชดเชยเป็นส่วนหัว HTTP ในคำขอ AJAX ด้วยjQuery
$.ajaxSetup({
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);
}
});
คุณสามารถทำสิ่งที่คล้ายกันเพื่อรับชื่อเขตเวลาจริงโดยใช้moment.tz.guess();
จากhttp://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/
ฉันยังไม่เห็นคำตอบโดยละเอียดที่นี่เพื่อให้ได้เขตเวลา คุณไม่จำเป็นต้องระบุรหัสภูมิศาสตร์ด้วยที่อยู่ IP หรือใช้ PHP (lol) หรือเดาจาก offset อย่างไม่ถูกต้อง
ประการแรกเขตเวลาไม่ได้เป็นเพียงการชดเชยจาก GMT มันเป็นพื้นที่ของที่ดินที่กำหนดเวลาตามมาตรฐานท้องถิ่น บางประเทศมีเวลาออมแสงและจะเปิด DST ในเวลาที่ต่างกัน เป็นเรื่องสำคัญที่จะต้องได้รับโซนจริงไม่ใช่แค่ออฟเซ็ตปัจจุบัน
หากคุณตั้งใจจะจัดเก็บเขตเวลานี้ตัวอย่างเช่นในการตั้งค่าผู้ใช้ที่คุณต้องการโซนและไม่เพียง แต่การชดเชย สำหรับการแปลงเรียลไทม์มันไม่สำคัญมากนัก
ตอนนี้เพื่อรับโซนเวลาด้วย javascript คุณสามารถใช้สิ่งนี้:
>> new Date().toTimeString();
"15:46:04 GMT+1200 (New Zealand Standard Time)"
//Use some regular expression to extract the time.
อย่างไรก็ตามฉันพบว่าง่ายขึ้นเพียงใช้ปลั๊กอินที่มีประสิทธิภาพซึ่งส่งคืนเขตเวลาที่จัดรูปแบบ Olsen:
ด้วยdate
ฟังก์ชั่นPHP คุณจะได้รับวันเวลาที่เซิร์ฟเวอร์ตั้งอยู่ในเว็บไซต์ วิธีเดียวที่จะได้รับเวลาของผู้ใช้คือการใช้ JavaScript
แต่ฉันขอแนะนำให้คุณหากเว็บไซต์ของคุณต้องลงทะเบียนแล้ววิธีที่ดีที่สุดคือการขอให้ผู้ใช้ในขณะที่มีการลงทะเบียนเป็นเขตบังคับ คุณสามารถแสดงรายการโซนเวลาต่าง ๆ ในหน้าลงทะเบียนและบันทึกในฐานข้อมูล หลังจากนี้หากผู้ใช้ล็อกอินเข้าสู่เว็บไซต์คุณสามารถตั้งค่าโซนเวลาเริ่มต้นสำหรับเซสชันนั้นตามโซนเวลาที่ผู้ใช้เลือก
คุณสามารถตั้งค่าโซนเวลาที่เฉพาะเจาะจงใด ๆ date_default_timezone_set
โดยใช้ฟังก์ชั่น ชุดนี้จะกำหนดเขตเวลาสำหรับผู้ใช้
โดยทั่วไปเขตเวลาของผู้ใช้จะไปที่ฝั่งไคลเอ็นต์ดังนั้นเราต้องใช้ JavaScript สำหรับสิ่งนี้
ด้านล่างเป็นสคริปต์เพื่อรับเขตเวลาของผู้ใช้โดยใช้ PHP และ JavaScript
<?php
#http://www.php.net/manual/en/timezones.php List of Time Zones
function showclienttime()
{
if(!isset($_COOKIE['GMT_bias']))
{
?>
<script type="text/javascript">
var Cookies = {};
Cookies.create = function (name, value, days) {
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
var expires = "; expires=" + date.toGMTString();
}
else {
var expires = "";
}
document.cookie = name + "=" + value + expires + "; path=/";
this[name] = value;
}
var now = new Date();
Cookies.create("GMT_bias",now.getTimezoneOffset(),1);
window.location = "<?php echo $_SERVER['PHP_SELF'];?>";
</script>
<?php
}
else {
$fct_clientbias = $_COOKIE['GMT_bias'];
}
$fct_servertimedata = gettimeofday();
$fct_servertime = $fct_servertimedata['sec'];
$fct_serverbias = $fct_servertimedata['minuteswest'];
$fct_totalbias = $fct_serverbias – $fct_clientbias;
$fct_totalbias = $fct_totalbias * 60;
$fct_clienttimestamp = $fct_servertime + $fct_totalbias;
$fct_time = time();
$fct_year = strftime("%Y", $fct_clienttimestamp);
$fct_month = strftime("%B", $fct_clienttimestamp);
$fct_day = strftime("%d", $fct_clienttimestamp);
$fct_hour = strftime("%I", $fct_clienttimestamp);
$fct_minute = strftime("%M", $fct_clienttimestamp);
$fct_second = strftime("%S", $fct_clienttimestamp);
$fct_am_pm = strftime("%p", $fct_clienttimestamp);
echo $fct_day.", ".$fct_month." ".$fct_year." ( ".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm." )";
}
showclienttime();
?>
แต่ตามมุมมองของฉันมันจะดีกว่าที่จะถามผู้ใช้ว่าการลงทะเบียนเป็นสิ่งจำเป็นในโครงการของคุณหรือไม่
อย่าใช้ที่อยู่ IP เพื่อกำหนดสถานที่อย่างแน่นอน (และด้วยเหตุนี้) - เนื่องจาก NAT, พรอกซี (ความนิยมเพิ่มขึ้น) และ VPNs ที่อยู่ IP ไม่จำเป็นต้องสะท้อนถึงสถานที่จริงของผู้ใช้จริง เซิร์ฟเวอร์ที่ใช้โปรโตคอลเหล่านั้นอยู่
เช่นเดียวกับวิธีที่รหัสพื้นที่ในสหรัฐอเมริกาไม่มีประโยชน์สำหรับการค้นหาผู้ใช้โทรศัพท์อีกต่อไปเนื่องจากได้รับความนิยมในการพกพาหมายเลข
ที่อยู่ IP และเทคนิคอื่น ๆ ที่แสดงด้านบนมีประโยชน์ในการแนะนำค่าเริ่มต้นที่ผู้ใช้สามารถปรับ / แก้ไข
JavaScript:
function maketimus(timestampz)
{
var linktime = new Date(timestampz * 1000);
var linkday = linktime.getDate();
var freakingmonths = new Array();
freakingmonths[0] = "jan";
freakingmonths[1] = "feb";
freakingmonths[2] = "mar";
freakingmonths[3] = "apr";
freakingmonths[4] = "may";
freakingmonths[5] = "jun";
freakingmonths[6] = "jul";
freakingmonths[7] = "aug";
freakingmonths[8] = "sep";
freakingmonths[9] = "oct";
freakingmonths[10] = "nov";
freakingmonths[11] = "dec";
var linkmonthnum = linktime.getMonth();
var linkmonth = freakingmonths[linkmonthnum];
var linkyear = linktime.getFullYear();
var linkhour = linktime.getHours();
var linkminute = linktime.getMinutes();
if (linkminute < 10)
{
linkminute = "0" + linkminute;
}
var fomratedtime = linkday + linkmonth + linkyear + " " +
linkhour + ":" + linkminute + "h";
return fomratedtime;
}
เพียงระบุเวลาของคุณในรูปแบบเวลาประทับของ Unix ให้กับฟังก์ชันนี้ JavaScript ทราบเขตเวลาของผู้ใช้แล้ว
แบบนี้:
PHP:
echo '<script type="text/javascript">
var eltimio = maketimus('.$unix_timestamp_ofshiz.');
document.write(eltimio);
</script><noscript>pls enable javascript</noscript>';
การดำเนินการนี้จะแสดงเวลาอย่างถูกต้องตามเขตเวลาที่บุคคลนั้นตั้งไว้บนนาฬิกาคอมพิวเตอร์ของเขา / เธอ ไม่จำเป็นต้องขออะไรกับใครและบันทึกลงในสถานที่ขอบคุณพระเจ้า!
ง่ายเพียงใช้getTimezoneOffset
ฟังก์ชันJavaScript เช่นนั้น:
-new Date().getTimezoneOffset()/60;
ความมหัศจรรย์ทั้งหมดดูเหมือนจะเป็นสิ่งต่อไปนี้
visitortime.getTimezoneOffset()
มันเยี่ยมมากฉันไม่รู้เรื่องนั้นเลย ใช้งานได้ใน Internet Explorer หรือไม่? จากตรงนั้นคุณควรจะสามารถใช้ JavaScript เป็น Ajax ตั้งค่าคุกกี้ได้ ฉันอาจไปเส้นทางคุกกี้ด้วยตัวเอง
คุณจะต้องอนุญาตให้ผู้ใช้เปลี่ยนได้ เราพยายามใช้ตำแหน่งทางภูมิศาสตร์ (ผ่าน maxmind) เพื่อทำสิ่งนี้มานานแล้วและมันก็ผิดบ่อยพอ - พอที่จะทำให้มันไม่คุ้มค่าดังนั้นเราจึงให้ผู้ใช้ตั้งค่าไว้ในโปรไฟล์ของพวกเขาและแสดงการแจ้งเตือนผู้ใช้ที่ ยังไม่ได้ตั้งค่า
นี่คือบทความ (พร้อมซอร์สโค้ด) ที่อธิบายวิธีการตรวจสอบและใช้เวลาในภาษาท้องถิ่นในแอปพลิเคชัน ASP.NET (VB.NET, C #):
ในระยะสั้นวิธีการที่อธิบายจะขึ้นอยู่กับgetTimezoneOffset
ฟังก์ชั่นJavaScript ซึ่งจะส่งคืนค่าที่บันทึกไว้ในคุกกี้เซสชั่นและใช้โดยการใช้โค้ดเพื่อปรับค่าเวลาระหว่าง GMT และเวลาท้องถิ่น สิ่งที่ดีคือผู้ใช้ไม่จำเป็นต้องระบุเขตเวลา (รหัสจะทำโดยอัตโนมัติ) มีส่วนร่วมมากขึ้น (นี่คือเหตุผลที่ฉันเชื่อมโยงไปยังบทความ) แต่รหัสที่ให้ทำให้ใช้งานง่าย ฉันสงสัยว่าคุณสามารถแปลงตรรกะเป็น PHP และภาษาอื่น ๆ (ตราบเท่าที่คุณเข้าใจ ASP.NET)
หากคุณกำลังใช้OpenIDสำหรับการตรวจสอบสิทธิ์Simple Registration Extensionจะช่วยแก้ปัญหาสำหรับผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์แล้ว (คุณจะต้องแปลงจาก tz เป็นตัวเลข)
ตัวเลือกอื่นคือการอนุมานเขตเวลาจากการตั้งค่าประเทศของตัวแทนผู้ใช้ นี่เป็นวิธีที่ค่อนข้างหยาบ (ใช้ไม่ได้กับ en-US) แต่ทำการประมาณได้ดี
มันง่ายด้วย JavaScript และ PHP:
แม้ว่าผู้ใช้สามารถยุ่งกับนาฬิกาภายในและ / หรือเขตเวลาของเขา / เธอวิธีที่ดีที่สุดที่ฉันพบเพื่อให้ได้รับการชดเชยยังคงอยู่ new Date().getTimezoneOffset();
หรือเขตเวลาวิธีการที่ดีที่สุดที่ฉันพบเพื่อให้ห่างไกลจะได้รับการชดเชยซาก มันไม่รุกรานไม่ให้ปวดหัวและไม่จำเป็นต้องพึ่งพาบุคคลที่สาม
สมมติว่าฉันมีตารางusers
ที่มีเขตข้อมูลdate_created int(13)
สำหรับการจัดเก็บเวลาประทับของ Unix
สมมติว่าลูกค้าcreates a new account
ข้อมูลจะได้รับจากpost
และฉันต้องinsert/update
date_created column
Unix timestamp ของลูกค้าไม่ใช่ของเซิร์ฟเวอร์
เนื่องจากจำเป็นต้องใช้ timezoneOffset ณ เวลาที่แทรก / อัปเดตจึงถูกส่งเป็นองค์ประกอบ $ _POST พิเศษเมื่อลูกค้าส่งแบบฟอร์มจึงไม่จำเป็นต้องเก็บไว้ในเซสชันและ / หรือคุกกี้
var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets
var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off;
สมมติว่าเซิร์ฟเวอร์ได้รับtzo
เป็น$_POST['tzo']
;
$ts = new DateTime('now', new DateTimeZone($_POST['tzo']);
$user_time = $ts->format("F j, Y, g:i a");//will return the users current time in readable format, regardless of whether date_default_timezone() is set or not.
$user_timestamp = strtotime($user_time);
แทรก / ปรับปรุง date_created=$user_timestamp
แทรก
เมื่อดึงข้อมูล date_created คุณสามารถแปลงการประทับเวลาดังนี้:
$date_created = // Get from the database
$created = date("F j, Y, g:i a",$date_created); // Return it to the user or whatever
ตอนนี้ตัวอย่างนี้อาจตรงกับความต้องการของคนเมื่อมันมาถึงการแทรกการfirst
ประทับเวลา ... เมื่อมันมาถึงการประทับเวลาเพิ่มเติมหรือตารางคุณอาจต้องการพิจารณาการแทรกค่า tzo ในตารางผู้ใช้สำหรับการอ้างอิงในอนาคตหรือการตั้งค่า เป็นเซสชั่นหรือเป็นคุกกี้
PS แต่จะเกิดอะไรขึ้นถ้าผู้ใช้เดินทางและสลับเขตเวลา เข้าสู่ระบบที่ GMT + 4 เดินทางรวดเร็วไปยัง GMT-1 และเข้าสู่ระบบอีกครั้ง การเข้าสู่ระบบครั้งสุดท้ายจะเป็นในอนาคต
ฉันคิดว่า ... เราคิดมากเกินไป
คุณสามารถทำได้บนไคลเอนต์ที่มีช่วงเวลาและส่งค่าไปยังเซิร์ฟเวอร์ การใช้งานตัวอย่าง:
> moment.tz.guess()
"America/Asuncion"
การรับชื่อเขตเวลาฐานข้อมูล TZ ที่ถูกต้องใน PHP เป็นกระบวนการสองขั้นตอน:
ด้วย JavaScript getTimezoneOffset
ได้รับการชดเชยในเขตเวลานาทีผ่าน ออฟเซ็ตนี้จะเป็นค่าบวกหากเขตเวลาท้องถิ่นอยู่หลัง UTC และลบหากอยู่ข้างหน้า ดังนั้นคุณต้องเพิ่มเครื่องหมายตรงข้ามกับออฟเซ็ต
var timezone_offset_minutes = new Date().getTimezoneOffset();
timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes;
ผ่าน offset นี้ไปยัง PHP
ใน PHP แปลงออฟเซ็ตนี้เป็นชื่อเขตเวลาที่ถูกต้องด้วยฟังก์ชั่นtimezone_name_from_abbr
// Just an example.
$timezone_offset_minutes = -360; // $_GET['timezone_offset_minutes']
// Convert minutes to seconds
$timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
// America/Chicago
echo $timezone_name;</code></pre>
ผมเคยเขียนบล็อกโพสต์เกี่ยวกับมัน: วิธีการตรวจสอบเขตเวลาของผู้ใช้ใน PHP นอกจากนี้ยังมีตัวอย่าง
Intl.DateTimeFormat().resolvedOptions().timeZone
และส่งไปยังเว็บเซิร์ฟเวอร์ Ref: stackoverflow.com/questions/9772955/…
วิธีง่ายๆในการทำคือใช้:
new Date().getTimezoneOffset();
ตัวเลือกหนึ่งที่เป็นไปได้คือการใช้Date
ฟิลด์ส่วนหัวซึ่งกำหนดไว้ในRFC 7231และควรรวมเขตเวลาไว้ด้วย แน่นอนว่าไม่รับประกันว่าค่านี้จะเป็นเขตเวลาของลูกค้า แต่เป็นจุดเริ่มต้นที่สะดวก
นี่คือวิธีที่ฉันทำ สิ่งนี้จะตั้งค่าเขตเวลาเริ่มต้นของ PHP เป็นเขตเวลาท้องถิ่นของผู้ใช้ เพียงวางต่อไปนี้ไว้ด้านบนของทุกหน้าของคุณ:
<?php
session_start();
if(!isset($_SESSION['timezone']))
{
if(!isset($_REQUEST['offset']))
{
?>
<script>
var d = new Date()
var offset= -d.getTimezoneOffset()/60;
location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;
</script>
<?php
}
else
{
$zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);
$index = array_keys($zonelist, $_REQUEST['offset']);
$_SESSION['timezone'] = $index[0];
}
}
date_default_timezone_set($_SESSION['timezone']);
//rest of your code goes here
?>
ลองโค้ด PHP นี้:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=" . $ip . "&full=true");
$json = json_decode($json,true);
$timezone = $json['LocalTimeZone'];
?>