2016-07-21 50 views
0

我創建了以下過濾器來轉換MySQL日期並調整時區相對於UTC的時間。AngularJS自定義過濾器無法在iOS和IE上工作

angular.module('HIS') 
    .filter('dateToISO', function() { 
     return function (input) { 
      var offset = new Date().getTimezoneOffset(); 
      var date = new Date(input); 
      date.setTime(date.getTime()-offset*60000); 
      return date.toISOString(); 
     }; 
    }); 

然後,我使用過濾器將日期轉換爲我的首選格式並在HTML中顯示它們,如下所示。 (我已經改變了角插標籤[[ ]],以避免與Laravel的刀片語法{{ }}衝突)

[[prescription.patient.first_name]] [[prescription.patient.last_name]]<br> 
[[prescription.created_at | dateToISO | date:"EEEE, d/M/yy h:mm a"]] 

這工作正常,除了IE的所有桌面瀏覽器。此外,這不適用於iOS(Safari/Chrome)中的瀏覽器。

在桌面瀏覽器的工作,除了IE

Working example on desktop browsers except IE

不工作的iOS瀏覽器和IE瀏覽器。代之以顯示原始角碼。

Not working on iOS browsers

重要

當我在尋找,我發現,IE瀏覽器的問題,在角V1.3.3及以上得到解決。但是我正在使用v1.5.5,問題依然存在。在iOS瀏覽器上沒有關於這種情況的線索。任何人都可以解釋爲什麼發生這種情況以及如何解決這個問題?

提前致謝!

+0

瀏覽器在開發工具中登錄到控制檯時會發生什麼? – sibbl

+0

'RangeError:Number expected'在上面提到的過濾器中的匿名函數中,靠近'return date.toISOString();' –

+0

根據MSDN:「如果objDate不包含有效日期,則會引發RangeError異常[調用toISOString ()]。「。也許你可以檢查offset,date.getTime()的值和你傳遞給setTime函數的整個值? – sibbl

回答

3

我終於找到了問題的原因。我使用了var date = new Date(input);,其中輸入格式爲Y-m-d H:i:s,這是一個MySQL時間戳。

從時間戳創建Date對象時,JavaScript使用Date.parse。在許多瀏覽器的桌面版本中,他們接受MySQL時間戳來創建Date對象。但在iOS和IE中,這不起作用。對於使用字符串創建日期,時間戳應爲ISO格式。因此,它不接受MySQL時間戳。

爲了解決這個問題,我提到了this question,其中時間戳被拆分,然後用於創建日期對象。

angular.module('HIS') 
    .filter('dateToISO', function() { 
     return function (input) { 
      var t = input.split(/[- :]/); 
      var date = new Date(Date.UTC(t[0], t[1]-1, t[2], t[3], t[4], t[5])); 
      return date; 
     }; 
    }); 
相關問題