导航
  • 主页
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

解题思路分析:一个跨Timezone的DateTime

qiushuiwuhen 2002-12-15 01:51:24
加精
如果遇到不同Timezone的时间(如下),你会怎么处置呢
Sat, 14 Dec 2002 21:00:40 -0800
1。通常用的方法是:DateTime.Parse或Convert.ToDateTime()
均告失败,去掉-0800,就可以了,但不是正确的时间

2。反其道而行,我们如何得到带timezone的时间呢,如下
DateTime.Now.ToString("ddd, dd MMM yyyy H:m:s zzz")
结果 Sun, 15 Dec 2002 13:40:9 +08:00
既然能生成这样的字符串,就应该可以得到对应的DateTime
如下方法:
DateTime.ParseExact("Sun, 15 Dec 2002 13:40:9 +08:00","ddd, d MMM yyyy H:mm:s zzz",null)
结果:12/15/2002 1:40:09 PM

这时候改变TimeZone为+07:00,得到答案
结果:12/15/2002 2:40:09 PM 正确。

这时候将Sat, 14 Dec 2002 21:00:40 -0800代进去:
DateTime.ParseExact("Sat, 14 Dec 2002 21:00:40 -08:00","ddd, d MMM yyyy H:mm:s zzz",null)

结果12/15/2002 1:00:40 PM 正确。

3.剩下的就是将-0800转为-08:00
strDate=Regex.Replace(strDate,@"(\s(\+|\-)\d{2})(.?)(\d{2}).*","$1:$4");

旨在:
1.讨论更多.net内在的函数(包含DateTime系列)
2.学着独立解决问题,不要只想着找网上的成功例子。
3.新年来临之际,给大家拜个年,和圣诞快乐等。

...全文
381 点赞 收藏 44
写回复
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiushuiwuhen 2002-12-29
揭帖,祝大家来年美梦成真,心想事成,呵呵
回复
希偌 2002-12-26
好久没过来了,来学习一下,接点分
回复
7710703 2002-12-26
呵呵,昨天圣诞快乐。
回复
ykn 2002-12-26
up
回复
angel_lee 2002-12-24
Merry Christmas and have a great Christmas Eve.:)
回复
qiushuiwuhen 2002-12-24
1.就是因为大家都不关注内在函数,所以很多函数都自己写,虽然可以达到一样的效果
2.当然并不是所有的效果.net内在函数都能实现,但这一切都要看了相关的文档才能说,可惜研究.net内在函数的人太少了
3.申明应该是ddd, dd MMM yyyy HH:mm:ss zzz

最后祝大家圣诞快乐,今天是平安夜了。
回复
收藏!谢谢楼主!
回复
大健 2002-12-24
接分
回复
aspritionisdead 2002-12-18
旨在:
1.讨论更多.net内在的函数(包含DateTime系列)
2.学着独立解决问题,不要只想着找网上的成功例子。
3.新年来临之际,给大家拜个年,和圣诞快乐等。
***********************************************

1.呵呵,这么多.net内在函数,都讨论吗?
2.有现成例子最好,时间有限,有些问题没必要花这么多时间。
3.谢谢!也祝你圣诞快乐!
回复
aspritionisdead 2002-12-18
Lostinet(迷失网络)(大家注意∶他不是人)(ΔΔΔΔΔ) :
能共享你的日期控件吗?
回复
kinglht 2002-12-17
to Lostinet(迷失网络)(大家注意∶他不是人)(ΔΔΔΔΔ)
后面的(大家注意∶他不是人)(ΔΔΔΔΔ)是怎么弄得??
回复
gangganghao 2002-12-16
学习。。。学习。。。。
回复
Lostinet 2002-12-16
我有自己的日期控件。不需要验证输入。
回复
dotAge 2002-12-16
我曾在简体中文环境下用E文的VS.NET开发另一个地区类型的ASP.NET系统,该地区的日期习惯与我的系统不一致,但要保证系统发布出去也能正确倒是费了一番脑筋,目前基本上已经解决问题,但我规避了客户端浏览器对日期的合法性检测,因为我觉得客户端的码页设置大部分情况下很难控制和获知,用JAVASCRIPT检测非常复杂,比如,"03/02/2002"最终解析结果是3月2日还是2月3日,是很难预料的, 因此索性让它们提交过来我在服务器端检测,因为服务器端我可以强制他使用指定的culture:

web.config:
<globalization responseEncoding="utf-8" requestEncoding="utf-8" culture="zh-SG" />

aspx.vb:
Imports System.Globalization
.....
CI = System.Threading.Thread.CurrentThread.CurrentCulture
txtDocumentDate.Text = String.Format(CI, "{0:d}", SO.DocumentDate)
.....
try
SO.DocumentDate = Date.Parse(txtDocumentDate.Text, CI)
catch e as exception
'显示日期解析错误信息e.message
end try
.....

不知各位还有没有更好的建议?

回复
kinglht 2002-12-16
thanks for your help!!
Merry christmas and Happy new year to everybody!!!
回复
ameng_2002 2002-12-16
学习
回复
angel_lee 2002-12-16
to qiushuiwuhen(秋水无恨)

thanks very much for your knowledge about TimeZone.

to dotAge(老朽,提醒你及时结贴)

the post owner don't care scores , he just want to share more skills to us.

Happy Christmas and happy New Year to everyone!

^_^
回复
Lostinet 2002-12-16
:)
--------------------
新年???
回复
qiushuiwuhen 2002-12-16
以下是我用Parse的结果:

Parse方法有
public static DateTime Parse(string s);
public static DateTime Parse(string s, IFormatProvider provider);
public static DateTime Parse(string s, IFormatProvider provider, System.Globalization.DateTimeStyles styles);
public static DateTime ParseExact(string s, string format, IFormatProvider provider);
public static DateTime ParseExact(string s, string format, IFormatProvider provider, System.Globalization.DateTimeStyles style);
public static DateTime ParseExact(string s, string[] formats, IFormatProvider provider, System.Globalization.DateTimeStyles style);

基本上用的是Parse,用ParseExact可以简化步骤,
尤其注意最后一种中的string[] formats
可以设置你想可能有的多种时间表达方式,均可解析出来。

IFormatProvider 子类有
System.Globalization.CultureInfo , System.Globalization.DateTimeFormatInfo , System.Globalization.NumberFormatInfo

这里基本上用
DateTimeFormatInfo ,CultureInfo

DateTimeStyles如下:
public enum System.Globalization.DateTimeStyles
{
//AdjustToUniversal在beta版中没有
AdjustToUniversal = 0x00000010,
//取消内部,开头,结尾,全部非分隔符的字符,如空格
AllowInnerWhite = 0x00000004,
AllowLeadingWhite = 0x00000001,
AllowTrailingWhite = 0x00000002,
AllowWhiteSpaces = 0x00000007,
//如果没有日期,默认是当前日期,设置这个以后,使用0001-01-01
NoCurrentDateDefault = 0x00000008,
//使用默认的
None = 0x00000000,
}

to lostinet
我最早也曾想过自己写TimeZone,但总想挖掘更多内在的函数使用方法
因为准备新年结帖,所以不早了,欢迎更多的讨论和经验,代大家谢谢了
回复
dotAge 2002-12-16
是呀,这么好的贴子,贴主还要无私倒贴300分,太不公平了吧。
难道CSDN只有回答问题才能搛分,写优秀论文的倒反而不能得分?
回复
发动态
发帖子
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
社区公告
暂无公告