尝试这样的事情,使用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" ,
//-----------------------------------------------------------------------------------
} ;
我在浏览器端处理它,因此浏览器总是将格式为“2013-04-01T00:00:00.000Z”的UTC日期时间作为字符串传递给Web服务器。有没有办法改变默认值,以便Web方法参数列表中的c#日期对象默认使用UTC而不是本地时间?或者,也许有一个不同的字符串,我可以通过浏览器强制它在UTC?每次使用日期对象创建Web方法时,我都不想将日期转换为UTC。 –
根据这种理解提出一个新问题,但记住后果...可能使新类型更好,这种新类型也会包含偏移量。 – Jay
这是我最初问的问题。 –