如何将日期时间字符串转换为当前文化的日期时间字符串

35

我有一个字符串,其中写着"12/1/2011",在英语(美国)语言环境下,我的当前机器语言环境是英语(英国),对应的日期格式为"dd/mm/yyyy"。如何将"12/1/2011"转换为"1/12/2011"呢?我尝试过以下格式。

System.DateTime.Parse(result,System.Threading.Thread.CurrentThread.CurrentCulture)
              .ToString(System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern)

但是我无法看到任何输出.

-Lokesh。


这个回答解决了您的问题吗?DateTime 和 CultureInfo - rmjoia
6个回答

63
DateTimeFormatInfo usDtfi = new CultureInfo("en-US", false).DateTimeFormat;
DateTimeFormatInfo ukDtfi = new CultureInfo("en-GB", false).DateTimeFormat;
string result = Convert.ToDateTime("12/01/2011", usDtfi).ToString(ukDtfi.ShortDatePattern);

这将解决问题 ^^


抱歉,这不起作用了。DateTimeFormatInfo dtfi = new DateTimeFormatInfo(); dtfi.ShortDatePattern = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern; dtfi.DateSeparator = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.DateSeparator; result = Convert.ToDateTime(result, dtfi).ToString(System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern); - Lokesh
因为当你设置 dtfi.ShortDatePattern = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePat­tern; 时,它会获取你机器上当前的日期格式,而不是原始日期字符串的格式 :) - Kent
如果您将区域和语言设置为英语[uk],则短日期模式为dd/MM/yyyy。 - Lokesh
"String was not recognized as a valid DateTime." 的意思是:字符串无法识别为有效的日期时间格式。 - Can Ürek

10
这对我起作用:
string myTime = DateTime.Parse("12/1/2011")
                        .ToString(CultureInfo.GetCultureInfo("en-GB").DateTimeFormat.ShortDatePattern);

9
var culture = new CultureInfo( "en-GB" );
var dateValue = new DateTime( 2011, 12, 1 );
var result = dateValue.ToString( "d", culture ) );

CultureInfo culture = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.Name); System.DateTime dt = System.DateTime.Parse(result); result = dt.ToString("d", culture);我尝试了这个方法,但它没有起作用。您能告诉我为什么吗? - Lokesh

5
DateTime dateValue;
CultureInfo culture = CultureInfo.CurrentCulture;
DateTimeStyles styles = DateTimeStyles.None;
DateTime.TryParse(datetimestring,culture, styles, out dateValue);

兄弟,你救了我的一天。我到处寻找如何在变量级别上设置CultureInfo(而不更改CurrentCulture),但在Date DataType的属性、方法等中找不到它...。在典型的Date数据类型扩展方法下,TryParse不可用。当你向我展示DateTime.TryParse时,我意识到它超出了Date和DateTime的可用扩展方法。他们为什么要这样做?如果TryParse可以在Date类型的扩展方法中使用,那么您可以声明一个空日期并使用dateString + CultureInfo设置它本身!??? - Erx_VB.NExT.Coder
在日期时间转换中,您应该使用TryParse方法进行安全且容易的转换。 - Phoenix Kyaw

1
public static DateTime ConvertDateTime(string Date)
    {
        DateTime date=new DateTime();                        
        try
        {
            string CurrentPattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern;                
            string[] Split = new string[] {"-","/",@"\","."};
            string[] Patternvalue = CurrentPattern.Split(Split,StringSplitOptions.None);
            string[] DateSplit = Date.Split(Split,StringSplitOptions.None);
            string NewDate = "";
            if (Patternvalue[0].ToLower().Contains("d") == true && Patternvalue[1].ToLower().Contains("m")==true && Patternvalue[2].ToLower().Contains("y")==true)
            {
                NewDate = DateSplit[1] + "/" + DateSplit[0] + "/" + DateSplit[2];
            }
            else if (Patternvalue[0].ToLower().Contains("m") == true && Patternvalue[1].ToLower().Contains("d")==true && Patternvalue[2].ToLower().Contains("y")==true)
            {
                NewDate = DateSplit[0] + "/" + DateSplit[1] + "/" + DateSplit[2];
            }
            else if (Patternvalue[0].ToLower().Contains("y") == true && Patternvalue[1].ToLower().Contains("m")==true && Patternvalue[2].ToLower().Contains("d")==true)
            {
                NewDate = DateSplit[2] + "/" + DateSplit[0] + "/" + DateSplit[1];
            }
            else if (Patternvalue[0].ToLower().Contains("y") == true && Patternvalue[1].ToLower().Contains("d")==true && Patternvalue[2].ToLower().Contains("m")==true)
            {
                NewDate = DateSplit[2] + "/" + DateSplit[1] + "/" + DateSplit[0];
            }
            date = DateTime.Parse(NewDate, Thread.CurrentThread.CurrentCulture);
        }
        catch (Exception ex)
        {

        }
        finally
        {

        }

        return date;

    }

2
请编辑您的答案并格式化代码以使其可读 - kleopatra
@kleopatra 你也可以做到。 - j0k
2
也考虑添加一些描述。 - Chris Hasiński
1
@j0k 当然可以,但我不喜欢一直给大家喂食,他们应该自己学会做,不是吗 :-) - kleopatra
2
为什么要使用空的catch和finally块? - Firo

0

这对我有效,

DateTimeFormatInfo usDtfi = new CultureInfo("en-US", false).DateTimeFormat;
DateTimeFormatInfo ukDtfi = new CultureInfo("en-GB", false).DateTimeFormat;
string result = Convert.ToDateTime("26/09/2015",ukDtfi).ToString(usDtfi.ShortDatePattern);

2
这与当前接受的答案没有任何区别。 - Helix Quar
@helix 我只是交换了文化对象,因为现有的答案对我来说会导致错误,我没有足够的点来编辑现有的答案。 - vipin
可能是因为现有的答案是从美国转换到英国,而你的是从英国转换到美国。 - Helix Quar
@helix,请检查这两个日期“2015年9月26日”和“2011年1月12日”的答案。 - vipin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接