Від сервера я отримую змінну дати в такому форматі: 6/29/2011 4:52:48 PM
і це в UTC час. Я хочу перетворити його в час браузера поточного користувача за допомогою JavaScript.
Як це можна зробити за допомогою JavaScript або jQuery?
Від сервера я отримую змінну дати в такому форматі: 6/29/2011 4:52:48 PM
і це в UTC час. Я хочу перетворити його в час браузера поточного користувача за допомогою JavaScript.
Як це можна зробити за допомогою JavaScript або jQuery?
Відповіді:
Додайте "UTC" до рядка, перш ніж перетворити його на дату в javascript:
var date = new Date('6/29/2011 4:52:48 PM UTC');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
!
Остерігайтеся !
_ … розбору рядків дат із конструктором Date (і Date.parse, вони еквівалентні) сильно не рекомендується через розбіжності та невідповідності веб-переглядачів… (що, мабуть, було навіть більш вірним у 2011 році)
На мій погляд, сервери завжди повинні повертати дату в стандартизованому форматі 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).
Вам дійсно не потрібно робити весь цей аналіз, який просто ускладнює речі, доки ви не узгоджуєтесь із тим, який формат очікувати від сервера.
DateTime
об'єкт, за допомогою .toString("o")
якого повертається рядок у форматі ISO-8601, як показано вище. msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx У javascript це new Date().toISOString()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Це універсальне рішення:
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();
Для мене вище рішення не спрацювали.
З IE перетворення дати та часу за часом у місцеві є мало складним. Для мене дата веб-API є, '2018-02-15T05:37:26.007'
і я хотів конвертувати відповідно до локального часового поясу, тому я використав код нижче в JavaScript.
var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
Покладіть цю функцію на голову:
<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,""));
Це працює для мене:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
return newDate;
}
Після спроб декількох інших, розміщених тут, без хороших результатів, це, здавалося, спрацювало для мене:
convertUTCDateToLocalDate: function (date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
І це працює в зворотному напрямку - від Local Date до UTC:
convertLocalDatetoUTCDate: function(date){
return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
new Date(+date + date.getTimezoneOffset() * 6e4)
. ;-)
Додайте часовий пояс наприкінці, у цьому випадку "UTC":
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"
У відповіді Метта відсутній той факт, що літній час може бути різним між Date () та датою, яку він повинен перетворити - ось моє рішення:
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)
//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;
}
Це спрощене рішення, засноване на відповіді Адоріана Принца:
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));
Якщо ви не заперечуєте проти використання, moment.js
а ваш час перебуває в UTC, просто використовуйте наступне:
moment.utc('6/29/2011 4:52:48 PM').toDate();
якщо ваш час не є точним, а будь-яким іншим відомим вам місцем, використовуйте наступне:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();
якщо ваш час вже локальний, то використовуйте наступне:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');
Мені найпростішим здавалося використання
datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());
(я думав, першого рядка може бути достатньо, але є часові пояси, які вимикаються за частки годин)
new Date('date string')
, а потім додав ці два рядки, і, здається, повертається з часом, повністю відключеним часовою позначкою UTC сервера. з внесеними корективами, щоб вони відповідали місцевому часу користувача. Мені теж доводиться турбуватися про дивні часові пояси дробу ... Не впевнений, чи він ідеально тримається весь час ...
Рядок дати JSON (серіалізований у C #) виглядає як "2015-10-13T18: 58: 17".
У кутовому (слідом за Хульвеєм) зробіть 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' }}
Використання 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 .
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.@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);
}
Я відповідаю на це Якщо будь-яка потрібна функція, яка відображає перетворений час на конкретний елемент id та застосовує рядок формату дати yyyy-mm-dd, тут date1 є рядком, а 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();
}
Я знаю, що відповідь вже прийнято, але я отримую тут причину google, і я вирішив отримати натхнення від прийнятої відповіді, тому я хотів просто поділитися нею, якщо комусь потрібно.
На основі відповіді @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>
Я написав хороший маленький сценарій, який займає епоху UTC і перетворює його в часовий пояс клієнтської системи і повертає його у d / m / YH: 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;
};
Ви можете використовувати momentjs , що moment(date).format()
завжди дасть результат у місцевій даті .
Бонус , ви можете форматувати будь-який бажаний вам спосіб. Наприклад, наприклад.
moment().format('MMMM Do YYYY, h:mm:ss a'); // September 14th 2018, 12:51:03 pm
moment().format('dddd'); // Friday
moment().format("MMM Do YY");
Більш детальну інформацію можна знайти на веб-сайті Moment js
Ви можете це зробити, використовуючи файл 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');
Я створив одну функцію, яка перетворює всі часові пояси в місцевий час.
Я не використовував 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"
У моєму випадку мені довелося знайти різницю дат у секундах. Дата була рядком дати 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;
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 не підтримується в деяких браузерах) Ми отримуємо відмінність від UTC і віднімаємо його від часу UTC, який дає нам місцевий час. Оскільки повернення зміщення обчислюється за допомогою DST (виправте мене, якщо я помиляюся), тому він встановить цей час назад у змінній "utc". Нарешті поверніть об’єкт дати.
У Angular я використовував відповідь Бена таким чином:
$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}}