从服务器我得到这种格式的日期时间变量:6/29/2011 4:52:48 PM
,它是UTC时间。我想使用JavaScript将其转换为当前用户的浏览器时间。
如何使用JavaScript或jQuery完成此操作?
答案 0 :(得分:326)
在将字符串转换为javascript中的日期之前,将“UTC”附加到字符串:
var date = new Date('6/29/2011 4:52:48 PM UTC');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
答案 1 :(得分:95)
在我看来,服务器应始终在一般情况下以标准化ISO 8601格式返回日期时间。
更多信息:
在这种情况下,服务器将返回'2011-06-29T16:52:48.000Z'
,它将直接送入JS Date对象。
var utcDate = '2011-06-29T16:52:48.000Z'; // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);
localDate
将在正确的当地时间,在我的情况下将是两小时后(DK时间)。
你真的不必做所有这些只会让事情变得复杂的解析,只要你与服务器期望的格式一致。
答案 2 :(得分:87)
这是一个通用的解决方案:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000);
var offset = date.getTimezoneOffset() / 60;
var hours = date.getHours();
newDate.setHours(hours - offset);
return newDate;
}
用法:
var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
根据客户端本地设置显示日期:
date.toLocaleString();
答案 3 :(得分:33)
您应该获得客户端的(UTC)偏移量(以分钟为单位):
var offset = new Date().getTimezoneOffset();
然后做对应的加法或减法到你从服务器获得的时间。
希望这有帮助。
答案 4 :(得分:19)
将此功能放在脑中:
<script type="text/javascript">
function localize(t)
{
var d=new Date(t+" UTC");
document.write(d.toString());
}
</script>
然后为页面正文中的每个日期生成以下内容:
<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>
要删除GMT和时区,请更改以下行:
document.write(d.toString().replace(/GMT.*/g,""));
答案 5 :(得分:14)
对我而言,上述解决方案无效。
使用IE将UTC日期时间转换为本地有点棘手。
对我来说,来自网络API的日期时间为'2018-02-15T05:37:26.007'
,我想按照本地时区进行转换,因此我在JavaScript中使用了以下代码。
var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
答案 6 :(得分:10)
在尝试了其他几个没有好结果的人之后,这似乎对我有用:
convertUTCDateToLocalDate: function (date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
这可以采用相反的方式,从本地日期到UTC:
convertLocalDatetoUTCDate: function(date){
return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
答案 7 :(得分:9)
//Covert datetime by GMT offset
//If toUTC is true then return UTC time other wise return local time
function convertLocalDateToUTCDate(date, toUTC) {
date = new Date(date);
//Local time converted to UTC
console.log("Time: " + date);
var localOffset = date.getTimezoneOffset() * 60000;
var localTime = date.getTime();
if (toUTC) {
date = localTime + localOffset;
} else {
date = localTime - localOffset;
}
date = new Date(date);
console.log("Converted time: " + date);
return date;
}
答案 8 :(得分:8)
如果您不介意使用moment.js
并且您的时间是UTC,请使用以下内容:
moment.utc('6/29/2011 4:52:48 PM').toDate();
如果您的时间不在utc中,而是您知道的任何其他语言环境,请使用以下内容:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();
如果您的时间已经在当地,请使用以下内容:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');
答案 9 :(得分:8)
这对我有用:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
return newDate;
}
答案 10 :(得分:7)
在最后添加时区,在这种情况下&#39; UTC&#39;:
theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));
之后,使用 toLocale ()* 函数系列以正确的语言环境显示日期
theDate.toLocaleString(); // "6/29/2011, 9:52:48 AM"
theDate.toLocaleTimeString(); // "9:52:48 AM"
theDate.toLocaleDateString(); // "6/29/2011"
答案 11 :(得分:7)
Matt的回答是错过了Day()和转换所需的日期时间之间夏令时可能不同的事实 - 这是我的解决方案:
function ConvertUTCTimeToLocalTime(UTCDateString)
{
var convertdLocalTime = new Date(UTCDateString);
var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;
convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset );
return convertdLocalTime;
}
调试器中的结果:
UTCDateString: "2014-02-26T00:00:00"
convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)
答案 12 :(得分:7)
这是一个基于Adorjan Princ答案的简化解决方案:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date);
newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return newDate;
}
用法:
var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
答案 13 :(得分:5)
对我来说,最简单的似乎是使用
datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());
(我认为第一行可能已足够,但有些时区会在几小时内关闭)
答案 14 :(得分:3)
使用YYYY-MM-DD hh:mm:ss
格式:
var date = new Date('2011-06-29T16:52:48+00:00');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
要转换YYYY-MM-DD hh:mm:ss
格式,请确保您的日期遵循ISO 8601 format。
Year:
YYYY (eg 1997)
Year and month:
YYYY-MM (eg 1997-07)
Complete date:
YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
Complete date plus hours, minutes and seconds:
YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
Complete date plus hours, minutes, seconds and a decimal fraction of a second
YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where:
YYYY = four-digit year
MM = two-digit month (01=January, etc.)
DD = two-digit day of month (01 through 31)
hh = two digits of hour (00 through 23) (am/pm NOT allowed)
mm = two digits of minute (00 through 59)
ss = two digits of second (00 through 59)
s = one or more digits representing a decimal fraction of a second
TZD = time zone designator (Z or +hh:mm or -hh:mm)
需要注意的重要事项
T
分隔日期和时间,某些浏览器中的空格不起作用+hh:mm
设置时区,使用时区字符串(例如:'UTC')将无法在许多浏览器中使用。 +hh:mm
表示与UTC时区的偏移量。答案 15 :(得分:3)
JSON日期字符串(在C#中序列化)看起来像“2015-10-13T18:58:17”。
在角度中,(在Hulvej之后)制作localdate
过滤器:
myFilters.filter('localdate', function () {
return function(input) {
var date = new Date(input + '.000Z');
return date;
};
})
然后,显示当地时间,如:
{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}
答案 16 :(得分:2)
我回答这个如果任何人想要显示转换时间到特定id元素的函数并应用日期格式字符串yyyy-mm-dd 这里date1是字符串,ids是要显示的元素的id。
function convertUTCDateToLocalDate(date1, ids)
{
var newDate = new Date();
var ary = date1.split(" ");
var ary2 = ary[0].split("-");
var ary1 = ary[1].split(":");
var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
newDate.setUTCHours(parseInt(ary1[0]));
newDate.setUTCMinutes(ary1[1]);
newDate.setUTCSeconds(ary1[2]);
newDate.setUTCFullYear(ary2[0]);
newDate.setUTCMonth(ary2[1]);
newDate.setUTCDate(ary2[2]);
ids = document.getElementById(ids);
ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds();
}
我知道答案已被接受,但我在这里得到谷歌的原因,我确实解决了从接受的答案获得灵感所以我确实想要分享它,如果有人需要。
答案 17 :(得分:2)
@Adorojan's
的答案几乎是正确的。但是添加偏移量是不正确的,因为如果浏览器日期早于GMT,则偏移值将为负,反之亦然。
以下是我自带的解决方案,对我来说效果很好:
// Input time in UTC
var inputInUtc = "6/29/2011 4:52:48";
var dateInUtc = new Date(Date.parse(inputInUtc+" UTC"));
//Print date in UTC time
document.write("Date in UTC : " + dateInUtc.toISOString()+"<br>");
var dateInLocalTz = convertUtcToLocalTz(dateInUtc);
//Print date in local time
document.write("Date in Local : " + dateInLocalTz.toISOString());
function convertUtcToLocalTz(dateInUtc) {
//Convert to local timezone
return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000);
}
答案 18 :(得分:1)
基于@digitalbath的答案,这里有一个小函数来获取UTC时间戳并在给定的DOM元素中显示本地时间(在最后一部分使用jQuery):
https://jsfiddle.net/moriz/6ktb4sv8/1/
<div id="eventTimestamp" class="timeStamp">
</div>
<script type="text/javascript">
// Convert UTC timestamp to local time and display in specified DOM element
function convertAndDisplayUTCtime(date,hour,minutes,elementID) {
var eventDate = new Date(''+date+' '+hour+':'+minutes+':00 UTC');
eventDate.toString();
$('#'+elementID).html(eventDate);
}
convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');
</script>
答案 19 :(得分:1)
使用safari / chrome / firefox对我来说效果很好:
-DTEST
答案 20 :(得分:1)
这就是我将UTC转换为本地时间的方法:
const dataDate = '2020-09-15 07:08:08'
const utcDate = new Date(dataDate);
const myLocalDate = new Date(Date.UTC(
utcDate.getFullYear(),
utcDate.getMonth(),
utcDate.getDate(),
utcDate.getHours(),
utcDate.getMinutes()
));
document.getElementById("dataDate").innerHTML = dataDate;
document.getElementById("myLocalDate").innerHTML = myLocalDate;
<p>UTC<p>
<p id="dataDate"></p>
<p>Local(GMT +7)<p>
<p id="myLocalDate"></p>
结果:2020年9月15日星期二14:08:00 GMT + 0700(印度支那时间)。
答案 21 :(得分:1)
使用 dayjs 库:
(new Date()).toISOString(); // returns 2021-03-26T09:58:57.156Z (GMT time)
dayjs().format('YYYY-MM-DD HH:mm:ss,SSS'); // returns 2021-03-26 10:58:57,156 (local time)
(在nodejs中,使用前必做:const dayjs = require('dayjs');
在其他环境中,请阅读 dayjs 文档。)
答案 22 :(得分:0)
我写了一个漂亮的小脚本,它采用UTC时代并将其转换为客户端系统时区并以d / m / Y H:i:s(如PHP日期函数)格式返回:
getTimezoneDate = function ( e ) {
function p(s) { return (s < 10) ? '0' + s : s; }
var t = new Date(0);
t.setUTCSeconds(e);
var d = p(t.getDate()),
m = p(t.getMonth()+1),
Y = p(t.getFullYear()),
H = p(t.getHours()),
i = p(t.getMinutes()),
s = p(t.getSeconds());
d = [d, m, Y].join('/') + ' ' + [H, i, s].join(':');
return d;
};
答案 23 :(得分:0)
对我来说,这很好
if (typeof date === "number") {
time = new Date(date).toLocaleString();
} else if (typeof date === "string"){
time = new Date(`${date} UTC`).toLocaleString();
}
答案 24 :(得分:0)
您可以使用moment.js文件来完成此操作。
您只需提及时区的位置即可。
示例:如果要将日期时间转换为亚洲/加尔各答时区,您只需提及从moment.js
获得的时区地点名称。
var UTCDateTime="Your date obtained from UTC";
var ISTleadTime=(moment.tz(UTCDateTime, "Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');
答案 25 :(得分:0)
我创建了一个函数,可以将所有时区转换为本地时间。
我没有使用getTimezoneOffset(),因为它没有返回正确的偏移值
要求:
1. npm i moment-timezone
function utcToLocal(utcdateTime, tz) {
var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
var localDateTime
var hours = zoneValue.split(":")[0]
var minutes = zoneValue.split(":")[1]
if (operator === "-") {
localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else if (operator) {
localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else {
localDateTime = "Invalid Timezone Operator"
}
return localDateTime
}
utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")
//Returns "2019-11-14 12:45:37"
答案 26 :(得分:0)
就我而言,我必须找出以秒为单位的日期差。该日期是UTC日期字符串,因此我将其转换为本地日期对象。这就是我所做的:
let utc1 = new Date();
let utc2 = null;
const dateForCompare = new Date(valueFromServer);
dateForCompare.setTime(dateForCompare.getTime() - dateForCompare.getTimezoneOffset() *
60000);
utc2 = dateForCompare;
const seconds = Math.floor(utc1 - utc2) / 1000;
答案 27 :(得分:0)
我相信这是最好的解决方案:
let date = new Date(objDate);
date.setMinutes(date.getTimezoneOffset());
由于它以分钟为单位显示,因此将通过偏移适当地更新您的日期。
答案 28 :(得分:0)
tl;dr (new Date('6/29/2011 4:52:48 PM UTC')).toString()
源字符串必须指定时区或 UTC。
单线:
(new Date('6/29/2011 4:52:48 PM UTC')).toString()
在我的一个网络浏览器中的结果:
"Wed Jun 29 2011 09:52:48 GMT-0700 (Pacific Daylight Time)"
这种方法甚至可以适当地选择标准/夏令时。
(new Date('1/29/2011 4:52:48 PM UTC')).toString()
在我的浏览器中的结果:
"Sat Jan 29 2011 08:52:48 GMT-0800 (Pacific Standard Time)"
答案 29 :(得分:-1)
function getUTC(str) {
var arr = str.split(/[- :]/);
var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000)
return utc;
}
对于其他访问者 - 使用此函数从UTC字符串中获取本地日期对象,应该处理DST并将在IE,IPhone等上工作。
我们拆分了字符串(因为某些浏览器不支持JS Date解析) 我们与UTC有所不同,并从UTC时间中减去它,这给了我们当地时间。由于返回的偏移是用DST计算的(如果我错了,请纠正我),所以它会将时间设置回变量&#34; utc&#34;。最后返回日期对象。
答案 30 :(得分:-1)
在Angular中,我用Ben的方式回答:
$scope.convert = function (thedate) {
var tempstr = thedate.toString();
var newstr = tempstr.toString().replace(/GMT.*/g, "");
newstr = newstr + " UTC";
return new Date(newstr);
};
编辑:Angular 1.3.0在日期过滤器中添加了UTC支持,但我还没有使用它,但它应该更容易,格式如下:
{{ date_expression | date : format : timezone}}
答案 31 :(得分:-1)
对于TypeScript用户,这是一个辅助函数:
// Typescript Type: Date Options
interface DateOptions {
day: 'numeric' | 'short' | 'long',
month: 'numeric',
year: 'numeric',
timeZone: 'UTC',
};
// Helper Function: Convert UTC Date To Local Date
export const convertUTCDateToLocalDate = (date: Date) => {
// Date Options
const dateOptions: DateOptions = {
day: 'numeric',
month: 'numeric',
year: 'numeric',
timeZone: 'UTC',
};
// Formatted Date (4/20/2020)
const formattedDate = new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000).toLocaleString('en-US', dateOptions);
return formattedDate;
};