2012-08-04 5 views
10

Tôi nhận được một thức ăn json với một chuỗi ngày được định dạng như sau:Làm cách nào để định dạng chuỗi ngày này để các tập lệnh google nhận ra nó?

// 2012-08-03T23: 00: 26-05: 00

Tôi đã nghĩ tôi chỉ có thể chuyển thông tin này vào Ngày mới như vậy

var dt = new Date("2012-08-03T23:00:26-05:00"); 

Điều này hoạt động trên jsfiddle nhưng không có trong tập lệnh google. Nó trả về một ngày không hợp lệ. Sau khi đọc this post Tôi nhận ra nó có thể là cách GAS giải thích chuỗi ngày tháng vì vậy bây giờ tôi không chắc chắn cách định dạng lại ngày để làm cho nó hoạt động.

Có cách nào tốt nhất để định dạng lại chuỗi ngày đó để GAS có thể nhận ra đó là một ngày không?

Trả lời

18

Google Apps Script sử dụng phiên bản JavaScript cụ thể (ECMA-262 3rd Edition) và như bạn đã phát hiện, không thể phân tích cú pháp ngày/giờ theo định dạng ISO 8601. Dưới đây là một hàm biến đổi tôi sử dụng trong một số Apps Scripts tôi

var dt = new Date(getDateFromIso("2012-08-03T23:00:26-05:00")); 

// http://delete.me.uk/2005/03/iso8601.html 
function getDateFromIso(string) { 
    try{ 
    var aDate = new Date(); 
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + 
     "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\\.([0-9]+))?)?" + 
     "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?"; 
    var d = string.match(new RegExp(regexp)); 

    var offset = 0; 
    var date = new Date(d[1], 0, 1); 

    if (d[3]) { date.setMonth(d[3] - 1); } 
    if (d[5]) { date.setDate(d[5]); } 
    if (d[7]) { date.setHours(d[7]); } 
    if (d[8]) { date.setMinutes(d[8]); } 
    if (d[10]) { date.setSeconds(d[10]); } 
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); } 
    if (d[14]) { 
     offset = (Number(d[16]) * 60) + Number(d[17]); 
     offset *= ((d[15] == '-') ? 1 : -1); 
    } 

    offset -= date.getTimezoneOffset(); 
    time = (Number(date) + (offset * 60 * 1000)); 
    return aDate.setTime(Number(time)); 
    } catch(e){ 
    return; 
    } 
} 
+0

Xin chào. Liên kết tới "ECMA-262 3rd Edition" bị hỏng. Bạn có biết bất kỳ nơi nào mà đối tượng "Ngày" của Google được ghi chép (ví dụ: các nhà thầu, phương pháp, v.v.) không? Cảm ơn. – Kalin

+1

[Trang đặc tả ngôn ngữ ECMA-262] (http://www.ecma-international.org/publications/standards/Ecma-262.htm) <-Liên kết tới các phiên bản HTML và PDF. [Đối tượng ngày Phần Liên kết trực tiếp trong tài liệu HTML] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.9) –

+0

trên dòng 2 của regexp STRING, bạn cần hai dấu gạch chéo ngược trước dấu chấm , như vậy: \\. \. không phải là ký tự thoát hợp lệ và nếu bạn muốn một dấu gạch chéo ngược trong STRING, bạn cần phải thoát khỏi nó. Bây giờ, nếu bạn regex là giữa/và /, bạn sẽ không cần phải thoát khỏi dấu gạch chéo ngược –

1

Cách quay khó và chắc chắn để làm cho nó hoạt động nếu định dạng được biết trước là phân tích cú pháp.

var dtString = "2012-08-03T23:00:26-05:00"; 
var date = dtString.split('T')[0]; 
var time = dtString.split('T')[1].split('-')[0]; 
var tz = dtString.split('T')[1].split('-')[1]; 
var dt = new Date(date.split('-')[0] , date.split('-')[1] - 1, // month is special 
        date.split('-')[2], time.split(':')[0], 
        time.split(':')[1], time.split(':')[2] , 0); 

Tôi chưa thử nghiệm đoạn mã chính xác này, nhưng đã sử dụng mã tương tự. Vì vậy, điều này mang lại cho bạn một ý tưởng công bằng về cách tiến hành.

+0

@Srik ... hoạt động hoàn hảo. Cảm ơn bạn đã giúp đỡ. Bất kỳ ý tưởng tại sao google script không nhận ra chuỗi ngày đó? – jrad

+0

Chỉ hoạt động đối với múi giờ GMT-XX: XX, còn múi giờ trước GMT/UTC thì sao? – kksensei

7

Tìm thấy mã này có thể và rất đơn giản khác mà dường như cũng thực hiện công việc:

function test(){ 
    Logger.log(isoToDate("2013-06-15T14:25:58Z")); 
    Logger.log(isoToDate("2012-08-03T23:00:26-05:00")); 
    Logger.log(isoToDate("2012-08-03T23:00:26+05:00")); 
} 

function isoToDate(dateStr){// argument = date string iso format 
    var str = dateStr.replace(/-/,'/').replace(/-/,'/').replace(/T/,' ').replace(/\+/,' \+').replace(/Z/,' +00'); 
    return new Date(str); 
} 
+1

Điều này không hoạt động cho "2016-07-12T16: 30: 00.000 + 0200", mhawskeys câu trả lời là đáng tin cậy hơn – Paul

1

này đã làm việc cho tôi, khi chuyển đổi chuỗi ngày thành đối tượng ngày trong Google Script.

Chuỗi ngày được lấy từ ô Trang tính của Google theo phương thức getValue s().

Từ: 01.01.2017 22:43:34 đến: 2017/01/01 22:43:34 đã thực hiện công việc. Và sau đó là new Date().

var dateTimeObj = new Date(stringDate.replace(/^(\d{1,2})[-.](\d{1,2})[-.](\d{4})/g,"$3/$2/$1")); 
+0

** Lưu ý: * * Múi giờ của Google Trang tính và múi giờ Google Script bằng nhau. – NikitOn