我使用這種方法在前端使用 js 來在幾分鐘內獲得 utc 偏移量。對于 UTC 500,它給了我一個類似 -300 的結果
const d = new Date();
let diff = d.getTimezoneOffset();
現在我如何使用這個偏移量在 php 中創建日期?更具體地說,如何將此偏移量轉換為這樣的解決方案可接受的值:
$usersNow = new DateTime('now', new DateTimeZone(' 0300'));
我是否必須手動將偏移量設定為這樣的字串?
uj5u.com熱心網友回復:
該類DateTimeZone是 Derick Rethans 稱為“timelib”的庫中函式的包裝器,因此我們可以檢查源代碼以確認我們的選項。
建構式首先呼叫timelib_parse_zone,它將“GMT ”、“GMT-”、“ ”和“-”識別為偏移量的前綴,并將剩余的字串傳遞給timelib_parse_tz_cor。
正如Paolo在評論中指出的那樣,JS Date.getTimezoneOffset 函式回傳其偏移量,其符號與大多數其他符號相反:-300 表示比UTC提前300 分鐘的偏移量。因此,我們可以以“ ”作為負輸入,以“-”作為正輸入開始我們的字串,然后格式化其余值忽略符號。
該函式根據字串的長度處理以下格式:
- 長度 1: /* H */
- 長度 2: /* HH */
- 長度 3: /* H:M */
- 長度 4: /* H:MM, HH:M, HHMM */
- 長度 5: /* HH:MM */
- 長度 6: /* HHMMSS */
- 長度 8: /* HH:MM:SS */
如果您只關心整小時的偏移量,最簡單的格式是只包括小時(“H”和“HH”情況)。但是,沒有任何格式只有分鐘。
要覆寫所有時區,您需要一種同時包含小時和分鐘的格式。
查看代碼,“ 123”的值將被解釋為與“ 01:23”相同,但理論上它可能意味著“ 12:03”,因此最好避免這種歧義。我們可以插入零以形成固定長度的格式,如“HHMM”,或者我們可以包含“:”分隔符,它允許在任一側使用一個或兩個數字。
因此,詳細的實作可能如下所示:
// Sign is mandatory in the string; it's the opposite of what JS gave us
$sign = ($jsOffset < 0) ? ' ' : '-';
// Discard sign from offset for remaining calculations
$absOffsetMins = abs($jsOffset);
// Hours is offset divided by 60, discarding fractions
$offsetHourPart = intdiv($absOffsetMins, 60);
// Minutes is the remainder of that division: offset modulo 60
$offsetMinPart = $absOffsetMins % 60;
// Put it together; depending on value, result will be in format
// H:M, H:MM, HH:M, or HH:MM, all of which are supported
$timezoneString = $sign . $offsetHourPart . ':' . $offsetMinPart;
// Make the object
$timezone = new DateTimeZone($timezoneString);
uj5u.com熱心網友回復:
由于還有其他方法可以實作相同的目標,為了節省其他人的時間,這里有另一種 javascript 和 php 的解決方案。
前端,獲取時區而不是偏移量
Intl.DateTimeFormat().resolvedOptions().timeZone
// Output: Asia/Karachi
在后端:
$systemDate = new DateTime('now', new DateTimeZone($timezone));
$systemDate = $systemDate->format('d/m/Y');
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/516248.html
