用JS將指定時間轉化成用戶當地時區的時間


公司的項目是面向海外用戶的,但是最初的設計沒考慮到時差問題,存入數據庫的時間都是東八區的時間,導致現在補救有點坑爹......

有一個需求是,產品詳細頁需要注明此款產品的開售時間,當海外的用戶來訪問這個頁面時,不應該顯示的是東八區的時間,而應該顯示當地時區對應的時間。

.net的類庫里沒有獲取客戶端當地時區的方法的,比如ToLocalTime(),獲取的是服務器的時間,TimeZoneInfo里的一些方法,都是正向轉化,必須提供已知的時區編號,時區名稱等條件,但這些不是已知時,都是白搭。

查詢了資料,發現只能從JS入手,看到有兩種解決方案,一種是用ajax傳到服務端進行處理,第二種是設置cookie在服務端獲取再處理,如果不是大批量的數據呈現,感覺有點麻煩,之后自己寫了一個方法,具體方案就是從后台讀取的時間,先從前台的JS里轉化,再呈現到頁面上,具體看業務需求。

直接提供JS方法吧,如有什么不對的地方可以提出來:

/*
* 根據日期寫入時所在的時區號,傳化為客戶端所在時區的時間
*  東:負數,西:正數
*  Create Date:2016-01-27 By Harry  
*/
Date.prototype.ToLocalTimeByZoneNum = function (zoneNum) {
    if (isNaN(zoneNum))
        zoneNum = 0;
    this.setHours(this.getHours() + zoneNum);//轉化時間為UTC時間
    var clientTime = new Date();//客戶端當前時間
    var offset = Math.floor(clientTime.getTimezoneOffset() * 60000)//客戶端時間與UTC時間的偏移量(毫秒)
    this.setTime(this.getTime() - offset);//根據偏移量計算傳入時間在客戶端所在時區的對應時間
    return this;
}
//默認傳入東八區
Date.prototype.ToLocalTime = function () {
    this.ToLocalTimeByZoneNum(-8)
    return this;
}
/*
*  轉化成國外常用顯示格式
*  1:Mon Feb 01 2016 12:00:00
*  2:Mon Feb 01 2016
*  3:Feb 01 2016
*  4:Feb 01,2016
*  Create Date:2016-01-28 By Harry 
*/
Date.prototype.ToGlobalTime = function (type) {
    var _date = this.ToLocalTime().toString();
    switch (type) {
        case 1:
            return _date.substring(0, 25); //_date.indexOf('G')
            break;
        case 2:
            return _date.substring(0, 16)
            break;
        case 3:
            return _date.substring(3, 16)
            break;
        case 4:
            return _date.substring(3, 16).replace(/(.{7})/, "$1\n,");
            break;
        default:
            return this;
            break;
    }
}

附加兩個拓展方法,網上搜來的
// 對Date的擴展,將 Date 轉化為指定格式的String // 月(M)、日(d)、小時(h)、分(m)、秒(s)、季度(q) 可以用 1-2 個占位符, // 年(y)可以用 1-4 個占位符,毫秒(S)只能用 1 個占位符(是 1-3 位的數字) // Example: (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), // "H+": this.getHours(), //小時 "m+": this.getMinutes(), // "s+": this.getSeconds(), // "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; } /** * 更改日期 * y年, m月, d日, h小時, n分鍾,s秒 * Example: new Date().Add("d",-1) */ Date.prototype.Add = function (part, value) { value *= 1; if (isNaN(value)) { value = 0; } switch (part) { case "y": this.setFullYear(this.getFullYear() + value); break; case "m": this.setMonth(this.getMonth() + value); break; case "d": this.setDate(this.getDate() + value); break; case "h": this.setHours(this.getHours() + value); break; case "n": this.setMinutes(this.getMinutes() + value); break; case "s": this.setSeconds(this.getSeconds() + value); break; default: } }

 

作者:Harry

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM