根据c#中的文化转换(更改)当前日期时间
Posted
技术标签:
【中文标题】根据c#中的文化转换(更改)当前日期时间【英文标题】:Convert(change) current DateTime as per culture in c# 【发布时间】:2015-11-02 21:19:38 【问题描述】:if (!IsPostBack && !Page.IsCallback)
double OffsetHrs = GetTimeZoneOffsetFromCookie();
string dateFormat = ServiceManager.LocalizationService.GetString("AppHeaderTop", "DateFormat", "g");
CultureSelected CultureSelected = GetCultureSelected();
ASPxLabelCurrentTime.Text = DateTime.Now.ToUniversalTime().AddHours(-OffsetHrs).ToString(dateFormat);
if (CultureSelected.CultureCode != "en-US")
DateTimeFormatInfo usDtfi = new CultureInfo("en-US", false).DateTimeFormat;
DateTimeFormatInfo currentDtfi = new CultureInfo(CultureSelected.CultureCode, false).DateTimeFormat;
ASPxLabelCurrentTime.Text = Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi).ToString(currentDtfi.ShortDatePattern); //what can i Use here ?
假设ASPxLabelCurrentTime.Text
的输出
对于en-US
,文化是11/2/2015 4:14 PM (70)
如果我选择特定文化,我希望此日期时间 11/2/2015 4:14 PM (70)
以该特定文化格式显示。
【问题讨论】:
避免使用Convert.ToDateTime
,改用DateTime.ParseExact
。
如果我使用 DateTime.ParseExact 如何代表不同文化的“格式”。使用不同文化的语法是什么??
@virtualreality 这取决于字符串和区域性设置。例如,文化必须是 PM
在它的 PMDesignator
属性中。
【参考方案1】:
您的问题似乎不清楚,但我尝试试一试。
首先,(70)
到底是什么?这是从哪里来的? en-US
culture 不能解析这个字符串,而不用ParseExact
或TryParseExact
方法在字符串文字分隔符中使用它。另一方面,由于您将 ASPxLabelCurrentTime.Text
设置为 DateTime.Now.ToUniversalTime().AddHours(-OffsetHrs).ToString(dateFormat)
代码的结果,我不相信 (70)
这部分真的是这个问题的问题。
其次,如果我理解清楚,问题似乎是DateTime.ToString(string)
方法的使用。
ASPxLabelCurrentTime.Text = Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi)
.ToString(currentDtfi.ShortDatePattern);
// ^^^ Problem seems here
好吧,假设您使用usDtfi
文化(即en-US
)成功解析了此ASPxLabelCurrentTime.Text
,但是使用此.ToString(string)
方法,您实际上并没有使用currentDtfi
设置,当您生成DateTime
的格式化字符串表示时,您正在使用CurrentCulture
设置。
来自DateTime.ToString(String)
doc;
将当前 DateTime 对象的值转换为其等效值 使用指定格式和格式的字符串表示 当前文化的惯例。
由于我们不知道 GetCultureSelected
方法究竟返回什么,它可能或可能不与 currentDtfi
的文化相同。
我强烈怀疑,您可以通过使用 that 文化作为ToString
方法中的第二个参数作为解决此问题;
ASPxLabelCurrentTime.Text = Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi)
.ToString(currentDtfi.ShortDatePattern, currentDtfi);
如果这个(70)
确实是您字符串的一部分,您需要使用ParseExact
或TryParseExact
方法来提供它的确切格式。
string s = "11/2/2015 4:14 PM (70)";
DateTime dt;
if(DateTime.TryParseExact(s, "MM/d/yyyy h:mm tt '(70)'", CultureInfo.GetCultureInfo("en-US"),
DateTimeStyles.None, out dt))
ASPxLabelCurrentTime.Text = dt.ToString(currentDtfi.ShortDatePattern, currentDtfi);
【讨论】:
是的。正如你所说的问题在于 ASPxLabelCurrentTime.Text = Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi) .ToString(currentDtfi.ShortDatePattern); // ^^^ 问题似乎在这里..................................当我使用它时,它正在转换2015 年 11 月 3 日上午 9:14 至 2015 年 3 月 11 日。时间没有显示出来......而且我们不必担心(70)。 @virtualreality 因为您使用的是ShortDatePattern
的CurrentCulture
,这是仅 显示日期部分。你想要什么结果在你的ASPxLabelCurrentTime.Text
上?
@virtualreality 那么你需要使用自定义格式为dd/MM/yyyy HH:mm
而不是ShortDatePattern
之类的; Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi).ToString("dd'/'MM'/'yyyy HH':'mm")
我在这里使用文化代码是因为我拥有不止一种文化,例如“en-US”、en-GB、it-IT、tr-TR 等等。是否有任何其他格式或日期模式可以处理任何文化日期时间格式。
if (CultureSelected.CultureCode != "en-US") DateTime datetimenow = DateTime.Parse(DateTime.Now.ToUniversalTime().AddHours(-iOffsetHours).ToString(dateFormat)); ASPxLabelCurrentTime.Text = datetimenow.ToString(new CultureInfo(CultureSelected.CultureCode));我尝试了上面的代码,它根据文化而变化,但我也得到了几秒钟的时间..对于“en-GB”这样的 03/11/2015 10:27:00 和“pt-PT”03-11-2015 10:29:00.. 怎样才能摆脱秒杀?如果没有,还有其他方法吗?以上是关于根据c#中的文化转换(更改)当前日期时间的主要内容,如果未能解决你的问题,请参考以下文章