如果我的 Web 应用程序和 API 存在于同一服务器上,则效果很好,但移动设备则不然。
我的一些用户使用 Flutter 从移动设备创建日历事件。当他们提交到 Web API 并希望事件发生在
04/08/2024 09:30pm
说到我的Web API,就改成了
04/08/2024 07:30pm
比他们预定的活动时间晚了整整 2 个小时。当事件到达 Web API 时,如何才能完全保留正确的事件时间?我尝试将开始日期和结束日期转换为
Datetime.LocalTime()
但本地时间是服务器时间。服务器时间是某个随机位置。
要解决此问题,您需要确保正确捕获移动设备中的时区信息并将其用于将事件时间转换为 UTC,然后再将其保存到数据库中。以下是您可以修改方法的方法:
捕获移动设备上的时区信息:在 Flutter 应用程序中,确保捕获创建事件的设备的时区信息。您可以使用
timezone
或 flutter_native_timezone
等软件包来获取时区 ID 或偏移量。
将时区信息发送到 Web API:将事件数据发送到 Web API 时,请包含从移动设备获取的时区信息以及事件日期时间。
在 Web API 中将事件日期时间转换为 UTC:在 ASP.NET Core Web API 中,使用从移动设备接收到的时区信息将事件日期时间正确转换为 UTC,然后再将其保存到数据库中。
以下是如何修改 ASP.NET Core Web API 来处理此问题的示例:
using System;
using Microsoft.AspNetCore.Mvc;
namespace YourNamespace.Controllers
{
[ApiController]
[Route("[controller]")]
public class EventController : ControllerBase
{
[HttpPost]
public IActionResult CreateEvent([FromBody] EventModel eventData)
{
if (eventData == null)
{
return BadRequest("Event data is null");
}
// Retrieve timezone information from request payload
string clientTimezoneId = eventData.TimezoneId;
int clientTimezoneOffsetMinutes = eventData.TimezoneOffsetMinutes;
// Convert event datetime to UTC
DateTime eventDateTime = eventData.EventDateTime;
TimeZoneInfo clientTimezone = TimeZoneInfo.FindSystemTimeZoneById(clientTimezoneId);
DateTime utcEventDateTime = TimeZoneInfo.ConvertTimeToUtc(eventDateTime, clientTimezone);
// Save utcEventDateTime to your database
return Ok("Event created successfully");
}
}
public class EventModel
{
public DateTime EventDateTime { get; set; }
public string TimezoneId { get; set; }
public int TimezoneOffsetMinutes { get; set; }
}
}
在此示例中,移动设备将事件日期时间以及时区 ID 和偏移量发送到 Web API。然后,Web API 使用提供的时区信息将事件日期时间转换为 UTC,然后将其保存到数据库。这可以确保无论服务器的时区如何,都可以正确保留事件时间。