2014-05-21 20 views
3

我传递了以下ISO 8601日期字符串到ASP.NET Web方法:默认ASP.NET DateTime.Kind为UTC在Web方法

2013-04-01T00:00:00.000Z

这是自动具有以下属性创建日期对象:

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

这是烦人,因为我现在要记得做followi我所有的约会对象UTC转换ng:

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. 
} 

回答

0

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

看来,在指定时区时,Date对象中的值将默认为本地时间。

诀窍是不通过时区。因此,任何这些字符串将工作:

2013-04-01T00:00:00.000 //离开该z在ISO 8601字符串

2013年4月1日00:00结束: 00

2013年4月1日

然而,这使得Date对象与Web方法如下性质:

价值:2013年4月1日上午12时零零分00秒

类:未指定

那种是不确定的,但日期对象的属性保留在UTC,这是我的目的,最重要的。

1
参见

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

如果指定字符串中的时区,你可以得到ASP.Net把它捡起来还我相信......

如果不使用新的解析器并将其注册为默认或创建一个新类型与偏移量。

+0

我在浏览器端处理它,因此浏览器总是将格式为“2013-04-01T00:00:00.000Z”的UTC日期时间作为字符串传递给Web服务器。有没有办法改变默认值,以便Web方法参数列表中的c#日期对象默认使用UTC而不是本地时间?或者,也许有一个不同的字符串,我可以通过浏览器强制它在UTC?每次使用日期对象创建Web方法时,我都不想将日期转换为UTC。 –

+0

根据这种理解提出一个新问题,但记住后果...可能使新类型更好,这种新类型也会包含偏移量。 – Jay

+0

这是我最初问的问题。 –

0

尝试这样的事情,使用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"  , 
     } ; 

如果您希望在处理UTC代号像+00+0000+00:00,你需要使用(分别)展开格式列表z, zz and zzz custom format specifiers

鉴于此,该代码

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" , 
    //----------------------------------------------------------------------------------- 
} ;