Javascript 如何将EST中的日期字符串与UTC中的日期对象进行比较?

Javascript 如何将EST中的日期字符串与UTC中的日期对象进行比较?,javascript,date,momentjs,Javascript,Date,Momentjs,我试图将EST中的字符串8/26/2019 6:53:13与new Date()对象进行比较,看看它是否在过去。这在本地运行良好,但在部署时,heroku的新日期以UTC格式传递。所以我不得不做这个黑客 if(process.env.NODE_ENV){ timeSubmitted.setHours(timeSubmitted.getHours() + 5); // HACK but does work } 我试图以UTC格式获取今天的日期和时间,作为对象而不是字符串,以便可

我试图将EST中的字符串
8/26/2019 6:53:13
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)
//设置日期范围
const startDate=新日期()//这将从EST转换为UTC
startDate.setMinutes(startDate.getMinutes()-2)//谷歌电子表格在过去节省了一点时间
//startDate=新日期(startDate.getTime()+startDate.getTimezoneOffset()*60000);
const endDate=新日期();
endDate.setDate(endDate.getDate()+5)
日志('startDate',startDate,'endDate',endDate)
rows.forEach(row=>{
//row.timestamp在美国东部时间看起来像是'8/26/2019 6:53:13'
var date=row.timestamp.split(“”[0]。split(“/”)
var time=row.timestamp.split(“”[1]。split(“:”)
var timeSubmitted=新日期(日期[2],日期[0]-1,日期[1],时间[0],时间[1],时间[2]);//所以这是在EST中
//但是当我部署到heroku时,我不得不做这个黑客。
if(process.env.NODE\u env){
timeSubmitted.setHours(timeSubmitted.getHours()+5);//HACK——这是我获得UTC时间的唯一方法/timeSubmitted=new Date(timeSubmitted.getTime()+timeSubmitted.getTimezoneOffset()*60000);
}
console.log('timeSubmitted',typeof timeSubmitted,typeof startDate,timeSubmitted,startDate,timeSubmitted>=startDate,timeSubmitted=startDate&&timeSubmitted
时区只是从日期生成人类可读字符串时要考虑的一个因素

但日期是一个时间点,不管时区如何。时间不知道时区!人类发明了时区

您可能正在以某种默认使用本地时区的方式对
日期
对象进行字符串化(未显示此代码)。这没关系

比较两个
Date
s作品。总是。你不必担心某些隐藏的时区组件会破坏它。只要比较一下你的约会,你就会发现效果很好


tl;dr:日期不是“格式”。日期就是日期。

时区只是从日期生成人类可读字符串时考虑的一个因素

但日期是一个时间点,不管时区如何。时间不知道时区!人类发明了时区

您可能正在以某种默认使用本地时区的方式对
日期
对象进行字符串化(未显示此代码)。这没关系

比较两个
Date
s作品。总是。你不必担心某些隐藏的时区组件会破坏它。只要比较一下你的约会,你就会发现效果很好


tl;dr:日期不是“格式”。日期就是日期。

EST是它在控制台中的显示方式。它不会回到任何东西。日期对象只存储自历元起的毫秒数。以获得唯一的时间点。它有方法将该值转换为日期、月份、年份或某种字符串格式来显示。我想我正在寻找类似这样的内容
let oldDate='8/26/2019 6:53:13'矩(oldDate,“MM-DD-YYYYHH:MM:ssZ”)。toDate()这会在国际范围内起作用并在夏令时进行调整吗?我真的被你的问题弄糊涂了,我想这是因为你在什么地方弄糊涂了。你永远不应该把时区偏移硬编码到你的代码中。如果字符串输入为UTC,则告诉
日期
构造函数以获得正确的表示形式。如果是其他时区,则告诉
Date
构造函数以获得正确的表示。其他一切似乎都分散了注意力<代码>日期
按您预期的方式工作,否则它就不适合使用。所以也许你所有的问题都源于这个黑客。这有点难说。您应该进一步缩小范围。EST是它在控制台中的显示方式。它不会回到任何东西。日期对象只存储自历元起的毫秒数。以获得唯一的时间点。它有方法将该值转换为日期、月份、年份或某种字符串格式来显示。我想我正在寻找类似这样的内容
let oldDate='8/26/2019 6:53:13'矩(oldDate,“MM-DD-YYYYHH:MM:ssZ”)。toDate()这会在国际范围内起作用并在夏令时进行调整吗?我真的被你的问题弄糊涂了,我想这是因为你在什么地方弄糊涂了。你永远不应该把时区偏移硬编码到你的代码中。如果字符串输入为UTC,则告诉
日期
构造函数以获得正确的表示形式。如果是其他时区,则告诉
Date
构造函数以获得正确的表示。其他一切似乎都分散了注意力<代码>日期
按您预期的方式工作,否则它就不适合使用。所以也许你所有的问题都源于这个黑客。这有点难说。你应该缩小范围。