默认的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.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
, zz
和zzz
自定义格式说明符来扩展格式列表。
考虑到这个,这个代码
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" ,
//-----------------------------------------------------------------------------------
} ;