【问题标题】:Date comparison in Client Side considering Timezone - Javascript/Jquery考虑时区的客户端日期比较 - Javascript/Jquery
【发布时间】:2021-09-16 05:08:21
【问题描述】:

我有一个要求,我需要将日期与当地时间进行比较。我在 EST DateTime 中的 DatetimePicker 中设置一个日期。所以我需要将它与当前时间进行比较,如果它小于当前时间,我需要显示验证警报。用户机器中的当前时间将属于不同的时区。所以我总是需要在比较之前将当前时区转换为 EST 时区。如果 EST 中用户机器中的当前时区,则需要考虑相同的值并且不需要转换。如何在 Javascript/Jquery 中实现这一点。如何修改下面的 javascript 以处理上述情况。

iam设置START_DATE n cshtml页面如下

  <div class='input-group date' id='datetimepicker1'>
                                @Html.EditorFor(model => model.START_DATE, new { htmlAttributes = new { @class = "form-control z-index-0" } })
                                <span class="input-group-addon" id="calenderStart">
                                    <span class="glyphicon glyphicon-calendar"></span>
                                </span>
                            </div>

在 Javascript 方面...

var startDate= new Date($("#START_DATE").val());
var currentDateTime= new Date();  //Convert to EST if it is in DifferentTimeZone.Doubt on this part
if(startDate < currentDateTime)
{
 alert ("StartDateTime should be greater than current EST DateTime);
}

【问题讨论】:

  • 使用 UTC 似乎更简单?此外,它会始终是 EST 还是在适当的时候是 EDT?
  • 用户有时可能在 IST 时区,有时可能是 EST...
  • "I am setting a Date in DatetimePicker which is in EST DateTime." 是什么意思准确地?您只显示检索元素中的值。这个值是什么样的?它是一个字符串吗?一个东西?一个号码?给出它返回的示例值。你是用代码设置的吗?如果是这样,请显示代码。你是通过用户交互设置的吗?如果是,请显示您输入的内容。
  • @MattJohnson-Pint -- 我已经更新了问题..请检查...从数据库广告中检索到的 START DATE 值显示在编辑页面中..该值在 EST 时区
  • @MattJohnson-Pint 开始日期(例如:07/15/2021 12:08 PM)将显示在 DateTimePicket 文本框中

标签: javascript jquery asp.net-mvc timezone date-comparison


【解决方案1】:

也许最容易理解的方法是将两个日期时间都转换为 UTC,然后进行比较。

要将您的日期选择器时间转换为 UTC,您只需添加 5 小时,因为 EST 总是比 UTC 晚 5 小时。

var theDateAsString = "07/15/2021 12:08 PM";
var dateFromDatePicker = new Date(theDateAsString);
dateFromDatePicker.setHours(dateFromDatePicker.getHours() + 5);
console.log(dateFromDatePicker);

无论您的位置如何,控制台都会为您提供 EST 时间加上 5 小时。控制台将打印带有时区偏移的 UTC 日期,例如,如果您在中欧夏令时区(比 UTC 晚 2 小时),它会打印以下内容:

Date Thu Jul 15 2021 17:08:00 GMT+0200 (Central European Summer Time)

所以现在您还需要将用户的时间转换为 UTC 以便能够进行比较。您可以使用getTimezoneOffset() 轻松完成此操作。这将以分钟为单位返回用户的时区偏移量,因此我们可以将这些分钟添加到用户的日期。

var usersDate = new Date();
console.log(usersDate); //e.g. Date Fri Jul 09 2021 12:44:39 GMT+0200 (Central European Summer Time)
console.log(usersDate.getTimezoneOffset());// e.g. -120 === -2 hours
usersDate.setMinutes(usersDate.getMinutes() + usersDate.getTimezoneOffset());
console.log(usersDate); // e.g. Date Fri Jul 09 2021 10:44:39 GMT+0200 (Central European Summer Time)

现在您可以比较日期了:

if(usersDate < dateFromDatePicker){
    alert("earlier");
}
else{
    alert("later or the same");
}

为了证明这一点有效,假设用户处于中欧夏令时(UTC + 2 小时),并且日期时间是 7 月 9 日 13:00。这将打印“用户的日期较早”,因为时区之间的差异是 7 小时(07:00 + 7 = 14:00):

var theDateAsString = "07/09/2021 07:00 AM";
var dateFromDatePicker = new Date(theDateAsString);
dateFromDatePicker.setHours(dateFromDatePicker.getHours() + 5);
console.log(dateFromDatePicker);
var usersDate = new Date();
usersDate.setMinutes(usersDate.getMinutes() + usersDate.getTimezoneOffset());
console.log(usersDate);
if(usersDate < dateFromDatePicker){
    console.log("user's date is earlier");
}
else{
    console.log("user's date is later or the same");
}

这将打印“用户的日期更晚或相同”(05:00 + 7 小时 = 12:00):

var theDateAsString = "07/09/2021 05:00 AM";
var dateFromDatePicker = new Date(theDateAsString);
dateFromDatePicker.setHours(dateFromDatePicker.getHours() + 5);
console.log(dateFromDatePicker);
var usersDate = new Date();
usersDate.setMinutes(usersDate.getMinutes() + usersDate.getTimezoneOffset());
console.log(usersDate);
if(usersDate < dateFromDatePicker){
    console.log("user's date is earlier");
}
else{
    console.log("user's date is later or the same");
}

【讨论】:

  • 感谢您的详细解释...我会尝试一下
【解决方案2】:

在 JavaScript 中,您可以使用 toLocaleString 并提供时区代码进行转换。

var d = new Date();
d.toLocaleString('en-GB', { timeZone: 'UTC' })
console.log(d);

More example can be found on this URL.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

【讨论】:

  • 这不能用于将固定的 EST 日期转换为 UTC。它将日期从用户的时区转换为 UTC。因此,除非您在 EST 时区,否则这是行不通的。
猜你喜欢
  • 2019-12-06
  • 2013-09-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多