Я використовую діаграму інтерфейсу Kendo в одному зі своїх проектівсьогодні помітив дивну поведінку в різних браузерах, у мене дата на осі х, і вона автоматично трансформує дати в різних браузерах з різним часовим поясом.
Як і в UTC + 5, він показує діапазон дат з 01.03.2014 по 31.03.2014, тоді як в UTC-6 він показує діапазон дат з 28.02.2014 по 30.03.2014.
Відповіді:
1 для відповіді № 1В основному це відбувається через різницюміж часовими поясами клієнта та сервера та формою ці дати переносяться та відтворюються з обох сторін у об'єкти Date (JS) / DateTime (.NET).
В основному вся ситуація пояснюється детально тут. Джерело даних, яке використовує діаграма, таке саме, як і те, яке використовує сітка, тому різниці немає.
Ось приклад коду з мого проекту, який ви можете використовувати. Перевірте обробник requestEnd
@(Html.Kendo().Grid<KendoMVCWrappers.Models.Person>().Name("persons")
.DataSource(dataSource => dataSource
.Ajax()
.Events(ev => ev.RequestEnd("convert"))
.Model(model => model.Id(m => m.PersonID))
.Read(read => read.Action("GetPersons", "Home"))
.Update(up => up.Action("UpdatePerson", "Home"))
)
.Filterable()
.Columns(columns =>
{
columns.Bound(c => c.PersonID);
columns.Bound(c => c.Name);
columns.Bound(c => c.BirthDate);
columns.Command(cmd => cmd.Edit());
})
.Pageable()
.Sortable()
)
<script type="text/javascript">
function convert(e) {
if (e.response.Data && e.response.Data.length) {
var offsetMiliseconds = new Date().getTimezoneOffset() * 60000;
var persons = e.response.Data;
for (var i = 0; i < persons.length; i++) {
persons[i].BirthDate = persons[i].BirthDate.replace(/d+/,
function (n) { return parseInt(n) + offsetMiliseconds }
);
}
}
}
</script>
І код встановлення ViewModel.Використання сеттера полегшує всю ситуацію, оскільки вам доводиться робити це в кількох місцях (перед створенням об'єкта, коли він витягується з бази даних і коли він створюється з ModelBinder).
public class Person
{
public int PersonID { get; set; }
public string Name { get; set; }
private DateTime birthDate;
public DateTime BirthDate
{
get { return this.birthDate; }
set
{
this.birthDate = new DateTime(value.Ticks, DateTimeKind.Utc);
}
}
}
Удачі!
0 для відповіді № 2
Отримав помилку нульової відповіді при спробі проаналізувати дату, як зазначено в цьому дописі в onRequestEnd. http://www.telerik.com/support/code-library/using-utc-time-on-both-client-and-server-sides
Я вирішую це шляхом синтаксичного аналізу в методі аналізу джерела даних замість requestEnd.
parse :function(data)
{
return ConvertToUTC(data);
}
function ConvertToUTC(data)
{
// iterate over all the data elements replacing the Date with a version
// that Kendo can work with.
$.each(data, function(index, item){
if(index == "data")
{
for(i =0 ;i< item.length; i++)
{
// Days is my date property in item collection
item[i].Days = item[i].Days.replace(/d+/,
function (n) {
var time = parseInt(n);
return parseInt(time) + new Date(time).getTimezoneOffset() * 60000;
}
);
}
}
});
return data;
}