C# 是否有一种区域性安全的方法来获取带前导零的ToSortDateString()和ToSortTimeString()?

C# 是否有一种区域性安全的方法来获取带前导零的ToSortDateString()和ToSortTimeString()?,c#,datetime,formatting,C#,Datetime,Formatting,我知道我可以使用格式字符串,但我不想丢失日期/时间格式的特定于区域性的表示形式。例如 2011年5月4日|下午2:06 |应该是2011年5月4日|下午2:06 | 但当我把它换成一种不同的文化时,我希望它是这样 04.05.2011 | 14:06 |…… 不更改格式字符串。这可能吗?我只看到一个解决方案-您应该获取当前区域性显示格式,对其进行修补,使其符合您的要求,并最终使用修补的格式字符串格式化日期时间值。以下是一些示例代码: string pattern = CultureInfo.Cu

我知道我可以使用格式字符串,但我不想丢失日期/时间格式的特定于区域性的表示形式。例如

2011年5月4日|下午2:06 |
应该是
2011年5月4日|下午2:06 |

但当我把它换成一种不同的文化时,我希望它是这样

04.05.2011 | 14:06 |……


不更改格式字符串。这可能吗?

我只看到一个解决方案-您应该获取当前区域性显示格式,对其进行修补,使其符合您的要求,并最终使用修补的格式字符串格式化日期时间值。以下是一些示例代码:

string pattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
        DateTime dt = DateTime.Now;
        string[] format = pattern.Split(new string[] { CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator }, StringSplitOptions.None);
        string newPattern = string.Empty;
        for(int i = 0; i < format.Length; i++) {
            newPattern = newPattern + format[i];
            if(format[i].Length == 1)
                newPattern += format[i];
            if(i != format.Length - 1)
                newPattern += CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator;
        }
string pattern=CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
DateTime dt=DateTime.Now;
string[]format=pattern.Split(新字符串[]{CultureInfo.currentcurity.DateTimeFormat.DateSeparator},StringSplitOptions.None);
string newPattern=string.Empty;
for(int i=0;i
正如承诺的那样,以下是改进的版本:

/// <summary>
/// Extensions for the <see cref="DateTime"/> class.
/// </summary>
public static class DateTimeExtensions
{
    /// <summary>
    /// Provides the same functionality as the ToShortDateString() method, but
    /// with leading zeros.
    /// <example>
    /// ToShortDateString: 5/4/2011 |
    /// ToShortDateStringZero: 05/04/2011
    /// </example>
    /// </summary>
    /// <param name="source">Source date.</param>
    /// <returns>Culture safe short date string with leading zeros.</returns>
    public static string ToShortDateStringZero(this DateTime source)
    {
        return ToShortStringZero(source,
            CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern,
            CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator);
    }

    /// <summary>
    /// Provides the same functionality as the ToShortTimeString() method, but
    /// with leading zeros.
    /// <example>
    /// ToShortTimeString: 2:06 PM |
    /// ToShortTimeStringZero: 02:06 PM
    /// </example>
    /// </summary>
    /// <param name="source">Source date.</param>
    /// <returns>Culture safe short time string with leading zeros.</returns>
    public static string ToShortTimeStringZero(this DateTime source)
    {
        return ToShortStringZero(source,
            CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern,
            CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator);
    }

    private static string ToShortStringZero(this DateTime source, 
        string pattern,
        string seperator)
    {
        var format = pattern.Split(new[] {seperator}, StringSplitOptions.None);

        var newPattern = string.Empty;

        for (var i = 0; i < format.Length; i++)
        {
            newPattern = newPattern + format[i];
            if (format[i].Length == 1)
                newPattern += format[i];
            if (i != format.Length - 1)
                newPattern += seperator;
        }

        return source.ToString(newPattern, CultureInfo.InvariantCulture);
    }
}
//
///类的扩展。
/// 
公共静态类DateTimeExtensions
{
/// 
///提供与ToSortDateString()方法相同的功能,但
///带前导零。
/// 
///ToSortDateString:5/4/2011|
///ToSortDateStringZero:2011年4月5日
/// 
/// 
///来源日期。
///具有前导零的区域性安全短日期字符串。
公共静态字符串ToSortDateStringZero(此日期时间源)
{
返回ToSortStringZero(源,
CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern,
CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator);
}
/// 
///提供与ToShortTimeString()方法相同的功能,但
///带前导零。
/// 
///ToShortTimeString:下午2:06|
///ToShortTimeStringZero:02:06 PM
/// 
/// 
///来源日期。
///具有前导零的区域性安全短时间字符串。
公共静态字符串ToSortTimeStringzero(此日期时间源)
{
返回ToSortStringZero(源,
CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern,
CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator);
}
私有静态字符串ToSortStringZero(此日期时间源,
字符串模式,
字符串分离器)
{
var format=pattern.Split(new[]{separator},StringSplitOptions.None);
var newPattern=string.Empty;
for(var i=0;i
您可以使用和进行翻译:

// Change the culture to something different
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-AT");
DateTime test_datetime = new DateTime(2008, 10, 2, 3, 22, 12);
string s_date = test_datetime.ToString(DateTimeFormatInfo.CurrentInfo);

// For specifically the short date and time
string s_date1 = 
   test_datetime.ToString(DateTimeFormatInfo.CurrentInfo.ShortDatePattern);
string s_time1 = 
   test_datetime.ToString(DateTimeFormatInfo.CurrentInfo.ShortTimePattern);

// Results
// s_date1 == 02.10.2008
// s_time1 == 03:22

您还可以重写CurrentThread.CurrentCulture类。在程序开始时,您可以调用此方法:

    private void FixCurrentDateFormat()
    {
        var cc = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
        var df = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat;
        df.FullDateTimePattern = PatchPattern(df.FullDateTimePattern);
        df.LongDatePattern = PatchPattern(df.LongDatePattern);
        df.ShortDatePattern = PatchPattern(df.ShortDatePattern);
        //change any other patterns that you could use

        //replace the current culture with the patched culture
        System.Threading.Thread.CurrentThread.CurrentCulture = cc;
    }

    private string PatchPattern(string pattern)
    {
        //modify the pattern to your liking here
        //in this example, I'm replacing "d" with "dd" and "M" with "MM"
        var newPattern = Regex.Replace(pattern, @"\bd\b", "dd");
        newPattern = Regex.Replace(newPattern, @"\bM\b", "MM");
        return newPattern;
    }

这样,在程序中将日期显示为字符串的任何地方,它都将具有新的格式。

我编写了一个方法来进行这种转换:

/// <summary>
/// Transform DateTime into short specified format
/// </summary>
/// <param name="strDateTime">string : input DateTime</param>
/// <param name="cultureInfo"></param>
/// <param name="strFormat">string - optional : ouput format - default "d"</param>
/// <returns></returns>
public static string ConvertDateTimeToShortDate(string strDateTime, CultureInfo cultureInfo, string strFormat="d")
{
  var dateTime = DateTime.MinValue;
  return DateTime.TryParse(strDateTime, out dateTime) ? dateTime.ToString(strFormat, cultureInfo) : strDateTime;
}

希望它能帮助你在这里找到真正复杂的答案。事实上,这很简单

datetime.ToString("d", culture) // Short date
datetime.ToString("t", culture) // Short time

有关所有格式和示例输出的完整列表,请参见。

谢谢,它运行得非常好,我将对其进行一点改进。完成它。工作得非常好,但我只使用en-US和de-at测试了它。匹配中的\b退格字符是什么?啊,算了吧,我找到了(单词边界)。
datetime.ToString("d", culture) // Short date
datetime.ToString("t", culture) // Short time