当客户端和服务器时区不同时,日期值会以不同方式保存

时间:2018-03-22 08:09:12

标签: javascript c# asp.net angularjs momentjs

我的AngularJS客户端将epoch毫秒的日期值传递给使用C#.NET的服务器。我的客户端和服务器驻留在不同的时区。我从客户端传递日期值,如下所示返回纪元毫秒:

var date = $scope.date.getTime()

如果我的客户选择的日期为' 2018年1月16日星期二00:00:00 GMT + 0530(印度标准时间) &# 39;纪元值对应于 1516041000000

但是当我把这个纪元传到我的服务器端时,GMT / UTC时间,即 星期一,2018年1月15日下午6:30:00 正在保存到我的数据库。

我试图通过我的API标头将GMT偏移传递给我的服务器,并将偏移值添加到UTC时间。但是,当存在夏令时时,这会导致问题,因为不同日期值的偏移量不同。

DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var savedDate = epoch.AddMilliseconds(long.Parse(passedDateEpoch)).AddMinutes(ClientGmtOffset);

有没有办法使用纪元时间值本身在服务器数据库中保存输入的确切日期。我不希望任何时候将部分或不正确的日期保存到数据库中。

4 个答案:

答案 0 :(得分:0)

使用可以指定webapiconfig文件中未指定的时间更多信息如[keep C# datetime local time between json and Web api?

您可以指定如下,以避免从服务器端转换时间

 public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);
            //subhash
            log4net.Config.XmlConfigurator.Configure();
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
            );

            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();


            config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified;

            config.Services.Replace(typeof(IExceptionHandler), new CustomExceptionHandler());
        }

我希望这会对你有所帮助

答案 1 :(得分:0)

试试这个:

double dateFromClient = double.Parse("1521707203364");
var savedDate = (new DateTime(1970, 1, 1)).AddMilliseconds(dateFromClient);

但我认为最好在数据库中保存Unix时间戳(例如1521707203364),然后当您将其返回给客户端时,客户端再次解析它并获得正确的日期。

答案 2 :(得分:0)

您可以在serverSide中使用以下代码

 public struct DateTimeWithZone
{
    private readonly DateTime utcDateTime;
    private readonly TimeZoneInfo timeZone;

    public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone)
    {
        var dateTimeUnspec = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified);
        utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTimeUnspec, timeZone); 
        this.timeZone = timeZone;
    }

    public DateTime UniversalTime { get { return utcDateTime; } }

    public TimeZoneInfo TimeZone { get { return timeZone; } }

    public DateTime LocalTime
    { 
        get 
        { 
            return TimeZoneInfo.ConvertTime(utcDateTime, timeZone); 
        }
    }        
}

答案 3 :(得分:0)

从这个前端返回日期

var date = new Date();

var isoDate = date.toISOString()