As commented by Nitesh in his answer, Etc/GMT is the same as GMT when the offset is zero or GMT+0. If I have realized this at the beginning, I may not have ask this question.
I've tried the following, and they results with "2019-11-21T09:53:10.000Z".
let date1 = new Date('2019 11 21 09:53:10 GMT+0');
console.log(date1.toISOString());
let date2 = new Date('2019 11 21 09:53:10 GMT');
console.log(date2.toISOString());
let date3 = new Date('11/21/2019 09:53:10 GMT+0000');
console.log(date3.toISOString());
let date4 = new Date('11/21/2019 09:53:10 GMT');
console.log(date4.toISOString());
The conversion will not work if I use my original sample value which contains '-' and 'Etc/'.
The following will also results to "2019-11-21T09:53:10Z"
let date5 = moment.tz("2019-11-21 09:53:10", "Etc/GMT+0");
console.log(date5.format());
let date6 = moment.tz("2019-11-21 09:53:10", "Etc/GMT+0");
console.log(date6.utc().format());
let date7 = moment.tz("2019-11-21 09:53:10", "Etc/GMT");
console.log(date7.format());
let date8 = moment.tz("2019-11-21 09:53:10", "Etc/GMT");
console.log(date8.utc().format());
I did not find any solution that does not alter the original value. So I will need to modify the original value first before creating the Date object.
let a = "2019-11-21 09:53:10 Etc/GMT"; // sample value
let b = a.replace(/-/g, " ").replace("Etc/", ""); // result: "2019 11 21 09:53:10 GMT"
let c = new Date(b);
console.log(c.toISOString()); // 2019-11-21T09:53:10.000Z
Alternatively, without creating a new Date object is also acceptable to me.
let d = "2019-11-21 09:53:10 Etc/GMT"; // sample value
let b = d.replace(" Etc/GMT", "Z").replace(" ", "T"); // result: "2019-11-21T09:53:10Z"
console.log(b);