Как сравнить строку Date в EST с объектом Date в UTC? - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь сравнить эту строку 8/26/2019 6:53:13, которая находится в EST, с new Date() объектом, чтобы просто увидеть, не в прошлом ли это. Это прекрасно работает локально, но при развертывании новая дата Heroku появляется в формате UTC. Поэтому мне пришлось сделать этот хак

 if(process.env.NODE_ENV){
      timeSubmitted.setHours(timeSubmitted.getHours() + 5);  // HACK but does work
 }

Я пытался получить сегодняшнюю дату и время в формате UTC как объект, а не строку, поэтому я могу сравнить его с другими временами в формате UTC.

var date = new Date('2014-02-27T10:00:00')
//Thu Feb 27 2014 10:00:00 GMT-0500 (Eastern Standard Time) //this is an object


let d = moment.utc(new Date()).format()
//Does convert right now to a UTC time string, but then when I try convert it to an object

new Date(d) 
//it goes back to EST 

Все вместе это работает, но не идеально из-за жестко закодированного числа 5.

//SET DATE RANGE
const startDate = new Date();//This gets converted from EST to UTC
startDate.setMinutes(startDate.getMinutes() - 2); //Google spreadsheets saves minutes a little in the past 
//startDate = new Date(startDate.getTime() + startDate.getTimezoneOffset() * 60000);

const endDate = new Date();
endDate.setDate(endDate.getDate()  + 5)
console.log('startDate ' ,startDate,'endDate ',endDate)


  rows.forEach(row=>{

    //row.timestamp looks like this '8/26/2019 6:53:13' in EST
    var date= row.timestamp.split(" ")[0].split('/')
    var time=row.timestamp.split(" ")[1].split(':')
    var timeSubmitted = new Date(date[2], date[0] - 1, date[1], time[0], time[1], time[2]); //So this is in EST 

    //but then when deploying to heroku i had to do this hack.

    if(process.env.NODE_ENV){
      timeSubmitted.setHours(timeSubmitted.getHours() + 5);  // HACK -- It's the only way I could get this time to be in UTC/timeSubmitted = new Date(timeSubmitted.getTime() + timeSubmitted.getTimezoneOffset() * 60000);
    }


    console.log('timeSubmitted',typeof timeSubmitted, typeof startDate, timeSubmitted, startDate, timeSubmitted >= startDate,  timeSubmitted < endDate)
    if(timeSubmitted >= startDate && timeSubmitted < endDate){ //Within the date range so check if the names are in the roster 
        slackers = slackers.filter(function(a){return a.fullname !== row.whatsyourname})
    }
  })
  messageSlackers(slackers, id)

1 Ответ

2 голосов
/ 03 ноября 2019

Часовые пояса - это просто фактор, принимаемый во внимание при создании удобочитаемой строки из даты.

Но дата - это момент времени, независимо от часовых поясов. Время не знает о часовых поясах! Люди изобрели часовые пояса.

Вы, вероятно, структурируете свои Date объекты некоторым образом, который использует ваш локальный часовой пояс по умолчанию (не показывали нам этот код). Это не имеет значения.

Сравнение двух Date работ. Всегда. Вам не нужно беспокоиться о том, что какой-то скрытый часовой пояс разрушит его. Просто сравните ваши даты, и вы увидите, что все работает нормально.

tl; dr: Даты не в «формате». Даты даты.

...