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