C# 使用当前区域性定义的12小时或24小时格式仅获取DateTime之后的小时数
.Net具有DateTime的内置ToSortTimeString()函数,该函数使用CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern格式。它为我们返回类似这样的内容:“下午5:00”。对于像de de这样的24小时文化,它将返回“17:00” 我想要的是一种只返回一个小时的方式(在上面的例子中是“下午5点”和“17点”),这种方式适用于所有文化。最好/最干净的方法是什么C# 使用当前区域性定义的12小时或24小时格式仅获取DateTime之后的小时数,c#,.net,culture,datetime-format,C#,.net,Culture,Datetime Format,.Net具有DateTime的内置ToSortTimeString()函数,该函数使用CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern格式。它为我们返回类似这样的内容:“下午5:00”。对于像de de这样的24小时文化,它将返回“17:00” 我想要的是一种只返回一个小时的方式(在上面的例子中是“下午5点”和“17点”),这种方式适用于所有文化。最好/最干净的方法是什么 谢谢 您可以使用DateTime.ToString()并
谢谢 您可以使用DateTime.ToString()并提供所需的格式作为参数。我将检查CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern是否包含“h”、“hh”、“h”、“t”或“tt”,以及它们的顺序,然后从中构建您自己的自定义格式字符串 var culture = CultureInfo.CurrentCulture; bool uses24HourClock = string.IsNullOrEmpty(culture.DateTimeFormat.AMDesignator); var dt = DateTime.Now; string formatString = uses24HourClock ? "HH" : "h tt"; Console.WriteLine(dt.ToString(formatString, culture)); e、 g
- en US:将“h:mm tt”映射到“h tt”
- ja JP:将“H:mm”映射到“H”
- fr fr:将“HH:mm”映射到“HH”
string full = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern;
string sh = String.Empty;
for (int k = 0; k < full.Length; k++)
{
char i = full[k];
if (i == 'h' || i == 'H' || i == 't' || i == 'T' || (i == ' ' && (sh.Length == 0 || sh[sh.Length - 1] != ' ')))
{
sh = sh + i;
}
}
if (sh.Length == 1)
{
sh = sh + ' ';
string rtnVal = DateTime.Now.ToString(sh);
return rtnVal.Substring(0, rtnVal.Length - 1);
{
else
{
return DateTime.Now.ToString(sh);
}
string full=System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern;
string sh=string.Empty;
for(int k=0;k
使用以下方法:
bool use2fHour =
CultureInfo
.CurrentCulture
.DateTimeFormat
.ShortTimePattern.Contains("H");
呃,我本来不想感兴趣,但现在我感兴趣了!下面的代码尊重所有文化,将am/PM指示符呈现在正确的位置,并识别24小时格式,所有这些都取决于文化 基本上,此静态扩展方法重载为获取当前区域性(无参数)或指定的区域性
DateTime.Now.ToTimeString()
DateTime.Now.ToTimeString(someCultureInfo)
代码如下,包括示例程序:
public static class DateTimeStaticExtensions
{
private static int GetDesignatorIndex(CultureInfo info)
{
if (info.DateTimeFormat
.ShortTimePattern.StartsWith("tt"))
{
return 0;
}
else if (info.DateTimeFormat
.ShortTimePattern.EndsWith("tt"))
{
return 1;
}
else
{
return -1;
}
}
private static string GetFormattedString(int hour,
CultureInfo info)
{
string designator = (hour > 12 ?
info.DateTimeFormat.PMDesignator :
info.DateTimeFormat.AMDesignator);
if (designator != "")
{
switch (GetDesignatorIndex(info))
{
case 0:
return string.Format("{0} {1}",
designator,
(hour > 12 ?
(hour - 12).ToString() :
hour.ToString()));
case 1:
return string.Format("{0} {1}",
(hour > 12 ?
(hour - 12).ToString() :
hour.ToString()),
designator);
default:
return hour.ToString();
}
}
else
{
return hour.ToString();
}
}
public static string ToTimeString(this DateTime target,
CultureInfo info)
{
return GetFormattedString(target.Hour, info);
}
public static string ToTimeString(this DateTime target)
{
return GetFormattedString(target.Hour,
CultureInfo.CurrentCulture);
}
}
class Program
{
static void Main(string[] args)
{
var dt = new DateTime(2010, 6, 10, 6, 0, 0, 0);
CultureInfo[] cultures =
CultureInfo.GetCultures(CultureTypes.SpecificCultures);
foreach (CultureInfo culture in cultures)
{
Console.WriteLine(
"{0}: {1} ({2}, {3}) [Sample AM: {4} / Sample PM: {5}",
culture.Name, culture.DateTimeFormat.ShortTimePattern,
(culture.DateTimeFormat.AMDesignator == "" ?
"[No AM]":
culture.DateTimeFormat.AMDesignator),
(culture.DateTimeFormat.PMDesignator == "" ?
"[No PM]":
culture.DateTimeFormat.PMDesignator),
dt.ToTimeString(culture), // AM sample
dt.AddHours(12).ToTimeString(culture) // PM sample
);
}
// pause program execution to review results...
Console.WriteLine("Press enter to exit");
Console.ReadLine();
}
}
尝试使用DateTime.Hour属性。一些区域性使用“H:mm”(8:11),而其他区域性使用“HH:mm”(08:11).你想不想保留前导零?嗯..我也可以。但是因为我想让字符串尽可能短,所以我不希望前导零。这在许多区域性中都不起作用。通常,AMDesignator在使用24小时时间的区域性中被定义为“???????”,而不是null或空。还有许多区域性对我们有用e 24小时时间仍然指定了AMDesignator。啊。我刚刚检查了一个区域性,发现AM/PM为空。只是假设这在所有区域性上都是一致的。有些区域性甚至更奇怪。例如:af ZA没有AMDesignator,但有一个PMDesignator,短时间模式为HH:mm tt…我遇到的问题是DateTime。Now.ToString(“H”)抛出一个格式异常,我不知道为什么。是的,我也注意到了。非常奇怪。我发现在末尾添加一个空格可以修复它:DateTime.Now.ToString(“H”).TrimEnd(“”).但这很难看..那么你验证过格式异常与长度为1的格式字符串有关吗?你有来源吗?系统中有一个格式字符串“h:mm.tt”。我不确定正确的输出是“h.tt”还是“h.tt”。也许没关系。DateTime.ToString(字符串)上的MSDN文章函数说,如果(a)格式的长度为1,并且它不是为DateTimeFormatInfo定义的格式说明符字符之一,或者(b)格式不包含有效的自定义格式模式,则会引发FormatException。(a)似乎涵盖了它。+1,这是非常干净的。请注意,正如已经指出的,如果“格式的长度是1,它不是为DateTimeFormatInfo定义的格式说明符字符之一”。也可能去掉重复空格。另外(只是查询,我以前没有见过它)您是否需要对提供程序进行null检查?我认为是文档中的。如果提供程序为null,GetInstance将返回CurrentInfo?这基本上与Rawling建议的解决方案相同,但使用正则表达式。是否有一种好方法确保使用正则表达式不会重复空格?@Rawling,@InvisibleBacon:Fixed。现在,将重复空格和句柄正常化
format.Length
为1的情况。我还删除了不必要的空检查。哦,我还没有看到?=before.Nifty。但是您的Trim()是否考虑了实际输出格式字符串以空格开头或结尾的情况,以防需要保留空格?(老实说,我更希望他支持你的解决方案,它更干净,表现为扩展方法等等。)@Rawling:它不能处理这个问题,但你想保留那些前导/尾随空格吗?
// displays "15" because my current culture is en-GB
Console.WriteLine(DateTime.Now.ToHourString());
// displays "3 pm"
Console.WriteLine(DateTime.Now.ToHourString(new CultureInfo("en-US")));
// displays "15"
Console.WriteLine(DateTime.Now.ToHourString(new CultureInfo("de-DE")));
// ...
public static class DateTimeExtensions
{
public static string ToHourString(this DateTime dt)
{
return dt.ToHourString(null);
}
public static string ToHourString(this DateTime dt, IFormatProvider provider)
{
DateTimeFormatInfo dtfi = DateTimeFormatInfo.GetInstance(provider);
string format = Regex.Replace(dtfi.ShortTimePattern, @"[^hHt\s]", "");
format = Regex.Replace(format, @"\s+", " ").Trim();
if (format.Length == 0)
return "";
if (format.Length == 1)
format = '%' + format;
return dt.ToString(format, dtfi);
}
}
public static class DateTimeStaticExtensions
{
private static int GetDesignatorIndex(CultureInfo info)
{
if (info.DateTimeFormat
.ShortTimePattern.StartsWith("tt"))
{
return 0;
}
else if (info.DateTimeFormat
.ShortTimePattern.EndsWith("tt"))
{
return 1;
}
else
{
return -1;
}
}
private static string GetFormattedString(int hour,
CultureInfo info)
{
string designator = (hour > 12 ?
info.DateTimeFormat.PMDesignator :
info.DateTimeFormat.AMDesignator);
if (designator != "")
{
switch (GetDesignatorIndex(info))
{
case 0:
return string.Format("{0} {1}",
designator,
(hour > 12 ?
(hour - 12).ToString() :
hour.ToString()));
case 1:
return string.Format("{0} {1}",
(hour > 12 ?
(hour - 12).ToString() :
hour.ToString()),
designator);
default:
return hour.ToString();
}
}
else
{
return hour.ToString();
}
}
public static string ToTimeString(this DateTime target,
CultureInfo info)
{
return GetFormattedString(target.Hour, info);
}
public static string ToTimeString(this DateTime target)
{
return GetFormattedString(target.Hour,
CultureInfo.CurrentCulture);
}
}
class Program
{
static void Main(string[] args)
{
var dt = new DateTime(2010, 6, 10, 6, 0, 0, 0);
CultureInfo[] cultures =
CultureInfo.GetCultures(CultureTypes.SpecificCultures);
foreach (CultureInfo culture in cultures)
{
Console.WriteLine(
"{0}: {1} ({2}, {3}) [Sample AM: {4} / Sample PM: {5}",
culture.Name, culture.DateTimeFormat.ShortTimePattern,
(culture.DateTimeFormat.AMDesignator == "" ?
"[No AM]":
culture.DateTimeFormat.AMDesignator),
(culture.DateTimeFormat.PMDesignator == "" ?
"[No PM]":
culture.DateTimeFormat.PMDesignator),
dt.ToTimeString(culture), // AM sample
dt.AddHours(12).ToTimeString(culture) // PM sample
);
}
// pause program execution to review results...
Console.WriteLine("Press enter to exit");
Console.ReadLine();
}
}