Получите только час дня от DateTime, использующего или 12 или 24-часовой формат, как определено текущей культурой

.NET имеет созданный в ToShortTimeString () функция для DateTime, который использует CultureInfo. CurrentCulture. DateTimeFormat. Формат ShortTimePattern. Это возвращает что-то вроде этого для en-США: "17:00". Для 24-часовой культуры, такой как de-DE это возвратилось бы "17:00".

То, что я хочу, является способом просто возвратить только час (Так "17:00" и "17" в случаях выше), который работает с каждой культурой. Что лучший/самый чистый путь состоит в том, чтобы сделать это?

Спасибо!

10
задан InvisibleBacon 10 June 2010 в 14:02
поделиться

7 ответов

// 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);
    }
}
6
ответ дан 4 December 2019 в 01:29
поделиться

Я бы проверил, содержит ли CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern "h", "hh", "H", "HH", "t" или "tt", и в каком порядке, а затем создал бы из них свою собственную строку формата.

например,

  • en-US: map "h:mm tt" to "h tt"
  • ja-JP: map "H:mm" to "H"
  • fr-FR: map "HH:mm" to "HH"

Затем используйте .ToString(), передавая построенную вами строку.

Пример кода - здесь в основном удаляется все, что не является t, T, h, H и множественные пробелы. Но, как указано ниже, просто строка с буквой "H" может потерпеть неудачу...

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);
}
4
ответ дан 4 December 2019 в 01:29
поделиться

Используйте это:

bool use2fHour =
    CultureInfo
        .CurrentCulture
        .DateTimeFormat
        .ShortTimePattern.Contains("H");
2
ответ дан 4 December 2019 в 01:29
поделиться

вы можете использовать DateTime.ToString () и указать нужный формат в качестве аргумента.

0
ответ дан 4 December 2019 в 01:29
поделиться

Ох, я не хотел интересоваться, но теперь я заинтересован! Вот код, который уважает все культуры и отображает указатели 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();
        }
    }
0
ответ дан 4 December 2019 в 01:29
поделиться
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));

Правка Сэма:

Вот код, доказывающий, что это не работает.

var date = new DateTime(2010, 1, 1, 16, 0, 0);

foreach (CultureInfo cultureInfo in CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures))
{
    bool amMethod = String.IsNullOrEmpty(cultureInfo.DateTimeFormat.AMDesignator);
    bool formatMethod = cultureInfo.DateTimeFormat.ShortTimePattern.Contains("H");

    if (amMethod != formatMethod)
    {
        Console.WriteLine("**** {0} AM: {1} Format: {2} Designator: {3}  Time: {4}",
                          cultureInfo.Name,
                          amMethod,
                          formatMethod,
                          cultureInfo.DateTimeFormat.AMDesignator,
                          date.ToString("t", cultureInfo.DateTimeFormat));
    }
}
-1
ответ дан 4 December 2019 в 01:29
поделиться

Попробуйте использовать свойство DateTime.Hour.

-1
ответ дан 4 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: