默认的ASP.净DateTime.Kind to UTC在Web方法中

本文关键字:UTC Web 方法 to Kind ASP DateTime 默认 | 更新日期: 2023-09-27 18:04:39

我将以下ISO 8601日期字符串传递给ASP。. NET Web方法:

2013 - 04 - 01 t00:00:00.000z

这将自动创建一个具有以下属性的date对象:

Value: 3/31/2013 8:00:00 PM
Kind:  Local (EDT)

这很烦人,因为我现在必须记住通过执行以下操作将所有日期对象转换为UTC:

date = date.ToUniversalTime();

我怎么能改变asp.net使日期传递到一个Web方法是在UTC默认而不是服务器的本地时间?是否有一些配置或挂钩,我可以使用来实现这一点?或者这根本不可能?

我根本不想麻烦地处理服务器的本地时间,因为它完全无关紧要。


编辑

只是补充一点信息,因为我上面似乎没有解释清楚。下面是一些示例代码:

JavaScript:

PageMethods.SendData("2013-04-01T00:00:00.000Z");
c#:

[WebMethod]
static public void SendData(DateTime date)
{
    // The value of date in here is 3/31/2013 8:00:00 PM Local
    // How can I make it so the default is 04/01/2014 0:00:00 AM Utc
    // without typing any extra code in here? 
    // How can I change ASP.NET's default behaviour?
    // I don't want to rely on the developer remembering.
}

默认的ASP.净DateTime.Kind to UTC在Web方法中

我找到了一个解决方案,但我仍然会接受一个答案,显示如何更改asp.net的默认行为默认为UTC日期,而不是服务器的本地时间在Web方法。

当指定时区时,Date对象中的值似乎将默认为本地时间。

诀窍是不要在时区中传递。所以这些字符串都可以:

2013-04-01T00:00:00.000//去掉ISO 8601字符串末尾的Z

2013-04-01就是

2013-04-01

但是,这会在Web方法中创建一个具有以下属性的date对象:

取值:4/01/2013 0:00:00 AM

:不明

类型未指定,但日期对象属性保留在UTC,这对我的目的很重要。

参见DateTimeOffset浏览器可能在不同的时区。如果您确定这是正确的,那么您应该记住,在向服务器发送日期时默认使用LocalTimeZone,因此转换将更改时间。您可能必须使用SpecifyKind方法。

我相信如果你在字符串中指定时区,你可以得到ASP。网捡起来也…

如果没有,使用新的解析器并将其注册为默认值,或者使用偏移量创建一个新的类型

试试这样做,使用DateTime.ParseExact():

    public static DateTime ParseAsZuluTime( string iso8601ZuluTime )
    {
      const DateTimeStyles style = DateTimeStyles.AssumeUniversal
                                 | DateTimeStyles.AdjustToUniversal
                                 ;
      DateTime value = DateTime.ParseExact( iso8601ZuluTime , formats , CultureInfo.InvariantCulture , style ) ;
      return value ;
    }
    static readonly string[] formats = {
      "yyyy-MM-ddTHH:mm:ss.fffK" , // K accepts
      "yyyy-MM-ddTHH:mm:ss.ffK"  , // the 'Z' suffix
      "yyyy-MM-ddTHH:mm:ss.fK"   , // or no suffix
      "yyyy-MM-ddTHH:mm:ssK"     ,
      "yyyy-MM-ddTHH:mm:ssK"     ,
      } ;

如果你希望处理像+00, +0000, +00:00这样的UTC指示符,你需要使用(分别)z, zzzzz自定义格式说明符来扩展格式列表。

考虑到这个,这个代码

static void Main( string[] args )
{
  string[] texts         = { "2014-05-23T17:45:32.123" ,
                             "2014-05-23T17:45:32.12"  ,
                             "2014-05-23T17:45:32.1"   ,
                             "2014-05-23T17:45:32"     ,
                             "2014-05-23T17:45"        ,
                           } ;
  string[] utcDesignators = { ""  ,
                              "Z"
                            } ;
  foreach ( string timeString in texts )
  {
    foreach ( string utc in utcDesignators )
    {
      string   timestamp = timeString+utc ;
      DateTime parsed    = ParseAsZuluTime(timestamp) ;
      Console.WriteLine() ;
      Console.WriteLine( "Text:     {0}" , timestamp  ) ;
      Console.WriteLine( "DateTime: {0:yyyy-MM-ddThh:mm:ss.fff}, Kind: {1}" , parsed , parsed.Kind ) ;
    }
  }
  Console.WriteLine() ;
  return;
}

产生以下结果:

Text:     2014-05-23T17:45:32.123
DateTime: 2014-05-23T05:45:32.123, Kind: Utc
Text:     2014-05-23T17:45:32.123Z
DateTime: 2014-05-23T05:45:32.123, Kind: Utc
Text:     2014-05-23T17:45:32.12
DateTime: 2014-05-23T05:45:32.120, Kind: Utc
Text:     2014-05-23T17:45:32.12Z
DateTime: 2014-05-23T05:45:32.120, Kind: Utc
Text:     2014-05-23T17:45:32.1
DateTime: 2014-05-23T05:45:32.100, Kind: Utc
Text:     2014-05-23T17:45:32.1Z
DateTime: 2014-05-23T05:45:32.100, Kind: Utc
Text:     2014-05-23T17:45:32
DateTime: 2014-05-23T05:45:32.000, Kind: Utc
Text:     2014-05-23T17:45:32Z
DateTime: 2014-05-23T05:45:32.000, Kind: Utc
Text:     2014-05-23T17:45
DateTime: 2014-05-23T05:45:00.000, Kind: Utc
Text:     2014-05-23T17:45Z
DateTime: 2014-05-23T05:45:00.000, Kind: Utc

编辑说明:这里是一个扩展的格式列表,允许使用时区指示符,如+00, +0000, +00:00, -08, +0545(尼泊尔),-03:30(纽芬兰)等。不过,此时您最好构造一个正则表达式并运行自己的解析器。

static readonly string[] formats = {
  //-----------------------------------------------------------------------------------
  // ISO 8601 Long Form
  //-----------------------------------------------------------------------------------
  // The 'K'   specifier accepts the Z designator for UTC or no designator
  // The 'z'   specifier accepts a time zone designator as '[+/-]HH'
  // The 'zz'  specifier accepts a time zone designator as '[+/-]HHMM'
  // The 'zzz' specifier accepts a time zone designator as '[+/-]HH:MM'
  //-----------------------------------------------------------------------------------
  "yyyy-MM-ddTHH:mm:ss.fffK"   , "yyyy-MM-ddTHH:mm:ss.ffK"   , "yyyy-MM-ddTHH:mm:ss.fK"   , "yyyy-MM-ddTHH:mm:ssK"   , "yyyy-MM-ddTHH:mm:ssK"   , "yyyy-MM-ddTHH:mmK"   ,
  "yyyy-MM-ddTHH:mm:ss.fffz"   , "yyyy-MM-ddTHH:mm:ss.ffz"   , "yyyy-MM-ddTHH:mm:ss.fz"   , "yyyy-MM-ddTHH:mm:ssz"   , "yyyy-MM-ddTHH:mm:ssz"   , "yyyy-MM-ddTHH:mmz"   ,
  "yyyy-MM-ddTHH:mm:ss.fffzz"  , "yyyy-MM-ddTHH:mm:ss.ffzz"  , "yyyy-MM-ddTHH:mm:ss.fzz"  , "yyyy-MM-ddTHH:mm:sszz"  , "yyyy-MM-ddTHH:mm:sszz"  , "yyyy-MM-ddTHH:mmzz"  ,
  "yyyy-MM-ddTHH:mm:ss.fffzzz" , "yyyy-MM-ddTHH:mm:ss.ffzzz" , "yyyy-MM-ddTHH:mm:ss.fzzz" , "yyyy-MM-ddTHH:mm:sszzz" , "yyyy-MM-ddTHH:mm:sszzz" , "yyyy-MM-ddTHH:mmzzz" ,
  //-----------------------------------------------------------------------------------
  // ISO 8601 Compact Form
  //-----------------------------------------------------------------------------------
  // The 'K'   specifier accepts the Z designator for UTC or no designator
  // The 'z'   specifier accepts a time zone designator as '[+/-]HH'
  // The 'zz'  specifier accepts a time zone designator as '[+/-]HHMM'
  // The 'zzz' specifier accepts a time zone designator as '[+/-]HH:MM'
  //-----------------------------------------------------------------------------------
  "yyyyMMddTHHmmss.fffK"   , "yyyyMMddTHHmmss.ffK"   , "yyyyMMddTHHmmss.fK"   , "yyyyMMddTHHmmssK"   , "yyyyMMddTHHmmssK"   , "yyyyMMddTHHmmK"   ,
  "yyyyMMddTHHmmss.fffz"   , "yyyyMMddTHHmmss.ffz"   , "yyyyMMddTHHmmss.fz"   , "yyyyMMddTHHmmssz"   , "yyyyMMddTHHmmssz"   , "yyyyMMddTHHmmz"   ,
  "yyyyMMddTHHmmss.fffzz"  , "yyyyMMddTHHmmss.ffzz"  , "yyyyMMddTHHmmss.fzz"  , "yyyyMMddTHHmmsszz"  , "yyyyMMddTHHmmsszz"  , "yyyyMMddTHHmmzz"  ,
  "yyyyMMddTHHmmss.fffzzz" , "yyyyMMddTHHmmss.ffzzz" , "yyyyMMddTHHmmss.fzzz" , "yyyyMMddTHHmmsszzz" , "yyyyMMddTHHmmsszzz" , "yyyyMMddTHHmmzzz" ,
  //-----------------------------------------------------------------------------------
  // ISO 8601 More Compact Form (omitting the 'T' time separator)
  //-----------------------------------------------------------------------------------
  // The 'K'   specifier accepts the Z designator for UTC or no designator
  // The 'z'   specifier accepts a time zone designator as '[+/-]HH'
  // The 'zz'  specifier accepts a time zone designator as '[+/-]HHMM'
  // The 'zzz' specifier accepts a time zone designator as '[+/-]HH:MM'
  //-----------------------------------------------------------------------------------
  "yyyyMMddHHmmss.fffK"   , "yyyyMMddHHmmss.ffK"   , "yyyyMMddHHmmss.fK"   , "yyyyMMddHHmmssK"   , "yyyyMMddHHmmssK"   , "yyyyMMddHHmmK"   ,
  "yyyyMMddHHmmss.fffz"   , "yyyyMMddHHmmss.ffz"   , "yyyyMMddHHmmss.fz"   , "yyyyMMddHHmmssz"   , "yyyyMMddHHmmssz"   , "yyyyMMddHHmmz"   ,
  "yyyyMMddHHmmss.fffzz"  , "yyyyMMddHHmmss.ffzz"  , "yyyyMMddHHmmss.fzz"  , "yyyyMMddHHmmsszz"  , "yyyyMMddHHmmsszz"  , "yyyyMMddHHmmzz"  ,
  "yyyyMMddHHmmss.fffzzz" , "yyyyMMddHHmmss.ffzzz" , "yyyyMMddHHmmss.fzzz" , "yyyyMMddHHmmsszzz" , "yyyyMMddHHmmsszzz" , "yyyyMMddHHmmzzz" ,
  //-----------------------------------------------------------------------------------
} ;