【问题标题】:DateTimeOffset in FullCalendar using ASP.NET MVC使用 ASP.NET MVC 在 FullCalendar 中的 DateTimeOffset
【发布时间】:2016-08-02 03:08:31
【问题描述】:

我将这个 DateTimeOffset 2016-08-01 09:30:00.0000000 -04:00 从我的 SQL Server 数据库传递到 FullCalendar。这些事件似乎正在呈现,但它们总是提前 4 小时。我想指出,当我使用 datetime2 时,它正在做完全相同的事情。我检查了 SQL Server,它显示了正确的当前时间,所以我不确定问题出在哪里。

这是我的 FullCalendar 实现:

<script type="text/javascript">
    $(document).ready(function ()
    {
        $('#calendar').fullCalendar(
        {
            header:
            {
                left: 'prev,next today',
                center: 'title',
                right: 'month,agendaWeek,agendaDay'
            },
            editable: false,
            events: "/home/loadevents/"

        })
    });
</script>

视图模型:

public class CalendarEventsViewModel
{
    //Properties have to conform to the following API standards
    //or the FullCalendar.js library will reject all incoming data.
    //http://fullcalendar.io/docs/event_data/Event_Object/

    public int id { get; set; }
    public string title { get; set; }
    public DateTimeOffset start { get; set; }
    public DateTimeOffset end { get; set; }
}

AcctionResult/Linq:

public ActionResult LoadEvents (DateTime start, DateTime end)
{

    IEnumerable<CalendarEventsViewModel> model =
    db.CalendarEvents
    .Select(r => new CalendarEventsViewModel
    {
        id = r.EventID,
        title = r.EventName,
        start = r.EventScheduleDateTime,
        end = r.EventScheduleDateTime,
    });


    return Json(model, JsonRequestBehavior.AllowGet);
}

编辑:

仔细查看断点后,我注意到不是将2016-08-01 09:30:00.0000000 -04:00 推送到 FullCalendar,而是推送8/1/2016 09:30:00 AM,但它仍显示为比我的当地时间提前四个小时。我不确定偏移量是否从我的 linq 语句中的 db 中丢失,即使我在 db 和我的 viewmodel 属性中都使用了 datetimeoffset。我还在上面添加了更多代码。

编辑 2:

看来我错了,它正在发送{8/1/2016 9:30:00 AM -05:00},所以我还不确定问题出在哪里。我的猜测是这可能不符合 FullCalendar 要求?

编辑 3:

在我的数据库中,我存储了2016-08-01 09:30:00.0000000 -04:00。当它到达 linq 查询时,根据调试它变为8/1/2016 9:30:00 AM -04:00。当日期/事件显示在 FullCalendar.js 中时,它显示为比下午 1:30 晚了四个小时。我一定对偏移量有误解,但我不知道是什么。

【问题讨论】:

  • 您在这方面取得了进展吗?我有兴趣看到结果。它是个人项目还是客户项目?如果它是个人的,你有它在公共存储库中吗?我很想看看,时区支持不是我在 FC 中玩过的东西。
  • 这是一个客户的小项目。自上次编辑以来,我什么都没做,我刚起床。我确定所有组件都可以正常工作我只是缺少一些东西。
  • 通过浏览器的 F12 工具或 Fiddler 等 HTTP 工具捕获一些实际的 JSON 响应。事件数据的 JSON 是什么样的?我猜它返回的是 old style format 而不是 ISO8601。
  • 不知道如何在 Chrome 中做到这一点,所以我尝试了 Fiddler,这就是我能找到的全部 [{"id":1,"title":"Some Event","start":"\/Date(1470058200000)\/","end":"\/Date(1470058200000)\/"},{"id":2,"title":"Event 2","start":"\/Date(1471320000000)\/","end":"\/Date(1471320000000)\/"}]
  • @AllyMurray 由于我无法对 FullCalendar Thai TImeZone 问题发表评论,如果我在 Twitter 或电子邮件上询问您,您是否介意? (at)Programazing 或 chris(at)thatamazingprogrammer.com

标签: jquery sql-server asp.net-mvc fullcalendar iso8601


【解决方案1】:

因为您使用的是 MVC 的 JsonResult(通过调用控制器的 Json 方法返回),所以 JSON 序列化由 JavaScriptSerializer 类处理。不幸的是,这个特殊的序列化程序不能很好地处理DateTimeOffset 值。它将它们标准化为 UTC,然后在 an antiquated format 中显示它们。

虽然 moment.js 确实可以读取该格式(因此可以读取 FullCalendar),但标准化过程意味着所有时间都将显示为 UTC,因此(在您的示例中)似乎提前四个小时。

您可以考虑两种方法来解决这个问题:

  1. 您可以通过将 the timezone parameter 设置为 local 来告诉 FullCalendar 调整用户本地时间的所有时间戳。这不需要更改后端,但意味着不同时区的用户将看到与自己相关的事件,而不是事件的本地时间。 (无论如何,这通常是需要的,因此请先考虑这一点。)

  2. 您可以将 MVC 代码中使用的序列化程序更改为使用 JSON.Net 而不是 JavaScriptSerializer。默认情况下,JSON.Net 将使用标准 ISO8601 格式,并将保留 DateTimeOffset 值的偏移量。如果您想在整个项目中全局执行此操作,请参阅this approach,尽管您可以简单地将LoadEvents 方法的最后一行更改为:

    string json = JsonConvert.SerializeObject(model);
    return Content(json, "application/json");
    

    另外值得一提的是,ASP.Net WebAPI 没有这个问题,因为它已经默认使用 JSON.Net。

【讨论】:

  • 我使用了最后一种方法,效果很好。我刚回来提到我已经意识到日历总是显示我发送给它的任何内容,就像那个时间在 UTC 0 中一样。要求是使日历默认为系统时区,而不是浏览器的本地时区。并在下拉菜单中提供一些时区选项。既然你帮我解决了这个问题,剩下的就不应该那么困难了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多