Pure JS. Моя задача состояла в том, что если образ «bl-once.png» пуст -> вставьте первый (который не имеет статуса 404) из списка массивов (в текущем каталоге):
<img src="http://localhost:63342/GetImage/bl-once.png" width="200" onerror="replaceEmptyImage.insertImg(this)">
Возможно, его нужно улучшить, но:
var srcToInsertArr = ['empty1.png', 'empty2.png', 'needed.png', 'notActual.png']; // try to insert one by one img from this array
var path;
var imgNotFounded = true; // to mark when success
var replaceEmptyImage = {
insertImg: function (elem) {
if (srcToInsertArr.length == 0) { // if there are no more src to try return
return "no-image.png";
}
if(!/undefined/.test(elem.src)) { // remember path
path = elem.src.split("/").slice(0, -1).join("/"); // "http://localhost:63342/GetImage"
}
var url = path + "/" + srcToInsertArr[0];
srcToInsertArr.splice(0, 1); // tried 1 src
if(imgNotFounded){ // while not success
replaceEmptyImage.getImg(url, path, elem); // CALL GET IMAGE
}
},
getImg: function (src, path, elem) { // GET IMAGE
if (src && path && elem) { // src = "http://localhost:63342/GetImage/needed.png"
var pathArr = src.split("/"); // ["http:", "", "localhost:63342", "GetImage", "needed.png"]
var name = pathArr[pathArr.length - 1]; // "needed.png"
xhr = new XMLHttpRequest();
xhr.open('GET', src, true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.status == 200) {
elem.src = src; // insert correct src
imgNotFounded = false; // mark success
}
else {
console.log(name + " doesn't exist!");
elem.onerror();
}
}
}
}
};
Итак, это будет вставьте правильный 'needed.png' в мой src или 'no-image.png' из текущего каталога.
Здесь я думаю, что это то, что вы ищете: Как игнорировать часовой пояс пользователя и заставить Date () использовать определенный часовой пояс
Мне кажется, что вы может сделать что-то вроде этого:
var date = new Date("6-25-2012 12:00:00 PM");
var offset = date.getTimezoneOffset(); // returns offset from GMT in minutes
// to convert the minutes to milliseconds
offset *= 60000;
// the js primitive value is unix time in milliseconds so this retrieves the
// unix time in milliseconds and adds our offset.
// Now we can put this all back in a date object
date = new Date(date.valueOf() + offset);
// to get back your sting you can maybe now do something like this:
var dateString = date.toLocaleString().replace(/\//g,'-').replace(',','');
Я использую фильтр перед отправкой даты на сервер vm.dateFormat = 'yyyy-MM-dd'; dateToSendToServer = $ filter ('date') (dateFromTheJavaScript, vm.dateFormat);
Не следует полагаться на конструктор Date
JavaScript для синтаксического анализа строки. Поведение и поддерживаемые форматы сильно различаются для каждого браузера и локали. Здесь являются только некоторыми поведения по умолчанию, если вы напрямую используете объект Date
.
Если вы должны исходить из строки, попробуйте использовать стандартизованный формат, такой как ISO8601. Дата, указанная в этом формате, будет "2012-06-25T12:00:00"
. Самый простой способ работать с ними в JavaScript - это moment.js .
Кроме того, будьте осторожны с тем, что вы на самом деле имеете в виду. Прямо сейчас вы проходите локальную дату / время, сохраняя локальный / дата / время и возвращая локальную дату / время. Попутно идея «локального» может измениться.
Во многих случаях дата / время предназначено для представления точного момента времени во времени. Чтобы выполнить эту работу, вам необходимо преобразовать с локального времени, введенного в UTC на клиенте. Отправьте UTC на свой сервер и сохраните его. Позже, получите UTC и отправьте его обратно своему клиенту, обработайте его как UTC и переведите обратно в локальное время. Вы можете сделать все это легко с помощью момента. Js:
// I'll assume these are the inputs you have. Adjust accordingly.
var dateString = "6-25-2012";
var timeString = "12:00:00 PM";
// Construct a moment in the default local time zone, using a specific format.
var m = moment(dateString + " " + timeString, "M-D-YYYY h:mm:ss A");
// Get the value in UTC as an ISO8601 formatted string
var utc = m.toISOString(); // output: "2012-06-25T19:00:00.000Z"
На сервере в .Net:
var dt = DateTime.Parse("2012-06-25T19:00:00.000Z", // from the input variable
CultureInfo.InvariantCulture, // recommended for ISO
DateTimeStyles.RoundtripKind) // honor the Z for UTC kind
Храните его в базе данных. Позже верните его и отправьте обратно:
// when you pull it from your database, set it to UTC kind
var dt = DateTime.SpecifyKind((DateTime)reader["yourfield"], DateTimeKind.Utc);
// send it back in ISO format:
var s = dt.ToString("o"); // "o" is the ISO8601 "round-trip" pattern.
Передайте его обратно в javascript в момент. Js:
// construct a moment:
var m = moment("2012-06-25T19:00:00.000Z"); // use the value from the server
// display it in this user's local time zone, in whatever format you want
var s = m.format("LLL"); // "June 25 2012 12:00 PM"
// or if you need a Date object
var dt = m.toDate();
См. - это было легко, и вы не нужно во что бы то ни стало придумать часовые пояса.
DateTimeOffset
для UTC. Несмотря на то, что они знают, что смещение всегда равно нулю, отслеживание того, что в DateTimeOffset
вместо DateTime
является хорошим способом предотвратить ошибочное его интерпретирование. Единственным недостатком этого является то, что он будет сериализован с +00:00
вместо Z
, но это часто бывает приемлемым.
– Matt Johnson
23 February 2017 в 18:34
Убейте JSON.Stringify () ... и выполните:
x = (your_date);
x.setHours(x.getHours() - x.getTimezoneOffset() / 60);