Como obtenho o valor AM / PM de um DateTime?

204

O código em questão está abaixo:

public static string ChangePersianDate(DateTime dateTime)
{
    System.Globalization.GregorianCalendar PC = new System.Globalization.GregorianCalendar();
    PC.CalendarType = System.Globalization.GregorianCalendarTypes.USEnglish;
    return
    PC.GetYear(dateTime).ToString()
    + "/"
    + PC.GetMonth(dateTime).ToString()
    + "/"
    + PC.GetDayOfMonth(dateTime).ToString()
    + ""
    + PC.GetHour(dateTime).ToString()
    + ":"
    + PC.GetMinute(dateTime).ToString()
    + ":"
    + PC.GetSecond(dateTime).ToString()
    + " "
    ????????????????
}

como posso obter o valor AM / PM dateTime?

Luz cinza
fonte
24
Existem maneiras muito melhores de formatar um do DateTimeque isso. Consulte msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF
Basta usardateTime.ToString("tt");
David Jesus

Respostas:

368

E se:

dateTime.ToString("tt", CultureInfo.InvariantCulture);
Andy
fonte
3
Você precisa adicionar nova System.Globalization.CultureInfo ( "en-US"), a fim de obter este direito (se você ainda não estiver em execução o fio em um contexto US)
thomas
1
@ Thomas - Bom ponto. Editado agora para especificarCultureInfo.InvariantCulture
Andy
8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
IndieTech Solutions
Isso para obter AM / PM a partir da data. Mas se eu quiser alterar AM para PM em qualquer data. Então, o que devo fazer ?
precisa saber é o seguinte
2
@AjaySharma Basta adicionar 12 horas antes da avaliação do formato. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM
107
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

Isso deve fornecer o valor da string do tempo. deve acrescentar a am / pm.

Você também pode olhar para o tópico relacionado:

Como você obtém a hora atual do dia?

XikiryoX
fonte
8
Isso deve estar em letras minúsculas, hhpois sua representação atual é impressa em 24 horas, com am e pm, o que é um pouco inútil
Não é amado
1
@LukeMcGregor Alterei a resposta conforme sua sugestão.
Doctor Jones
46

A DateTimedeve sempre ser internamente na (gregoriano) calendário "americano". Então se você faz

var str = dateTime.ToString(@"yyyy/MM/dd hh:mm:ss tt", new CultureInfo("en-US"));

você deve conseguir o que deseja em muito menos linhas.

xanatos
fonte
33

Muito simples usando o formato de string

em .ToSTring("") :

  • se você usar "hh" - >> A hora, usando um relógio de 12 horas de 01 a 12.

  • se você usar "HH" - >> A hora, usando um relógio de 24 horas de 00 a 23.

  • se você adicionar "tt" - >> O designador Am / Pm.

exemplo de conversão de 23:12 para 11:12 Pm:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("hh:mm tt");   // this show  11:12 Pm
var res2 = d.ToString("HH:mm");  // this show  23:12

Console.WriteLine(res);
Console.WriteLine(res2);

Console.Read();

espere um segundo que não é tudo o que você precisa para se preocupar com outra coisa: o sistema Culture, porque o mesmo código executado no Windows com outro idioma, especialmente com idioma diferente, irá gerar resultados diferentes com o mesmo código.

Um exemplo de janela definida para a linguagem árabe será mostrada assim:

// 23:12 م

م significa noite (primeira letra de مساء).

em outra cultura do sistema, depende do que está definido na opção regional e de idioma do windows, mostrará // 23:12 du.

você pode alternar entre diferentes formatos no painel de controle do Windows, em regional e idioma -> formato atual (caixa de combinação) e alterar ... aplicá-lo, reconstruir (executar) o aplicativo e ver o que estou falando.

então quem posso forçar a exibição de palavras Am e Pm em inglês se a cultura do sistema atual não estiver definida como inglês?

fácil apenas adicionando duas linhas: ->

o primeiro passo adicione using System.Globalization;em cima do seu código

e modificando o código anterior para ficar assim:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.InvariantCulture); // this show  11:12 Pm

InvariantCulture => usando o formato padrão em inglês.

outra pergunta: quero que a pm esteja em árabe ou em um idioma específico, mesmo que eu use janelas definidas para o formato regional em inglês (ou outro idioma)?

Soution para exemplo árabe:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.CreateSpecificCulture("ar-AE")); 

isso mostrará // 23:12 م

evento se meu sistema estiver definido para um formato de região em inglês. você pode alterar "ar-AE" se desejar outro formato de idioma. existe uma lista de cada idioma e seu formato.

exemplos:

ar          ar-SA       Arabic
ar-BH       ar-BH       Arabic (Bahrain)
ar-DZ       ar-DZ       Arabic (Algeria)
ar-EG       ar-EG       Arabic (Egypt)

big list...

me avise se você tiver outra pergunta.

Bilal
fonte
Se eu quero ver "23:12"? Eu acho que sua resposta está incompleta.
Fjodr 22/07/2015
18

Eu sei que isso pode parecer muito tarde .. no entanto, pode ajudar alguém lá fora

Como eu queria que a parte da tarde fosse AM PM, usei o que Andy aconselhou:

dateTime.ToString("tt");

Eu usei essa parte para construir um caminho para salvar meus arquivos. Criei minhas suposições de que obterei AM ou PM e nada mais!

no entanto, quando usei um PC que sua cultura não é inglesa .. (no meu caso árabe) .. meu aplicativo falhou porque o formato "tt" retornou algo novo, não AM nem PM (م ou ص) ..

Portanto, a solução foi ignorar a cultura adicionando o segundo argumento da seguinte maneira:

dateTime.ToString("tt", CultureInfo.InvariantCulture);

.. é claro que você precisa adicionar: using System.Globalization; no topo do seu arquivo espero que ajude alguém :)

searchSO
fonte
3
Obrigado por adicionar isso, pois me ajudou hoje - eu estava recebendo AM no meu ambiente de desenvolvimento e AM no servidor remoto e não havia uma quantidade enorme de ajuda do google com ele até ler este post. Até Dotnetpearls declara "Não há períodos na saída de tt. Se você precisar de períodos em seu AM ou PM, precisará manipular a string". Que, naturalmente, era completamente falso no meu caso ...
KiwiSunGoddess
13

é bem simples

  Date someDate = new DateTime();
  string timeOfDay = someDate.ToString("hh:mm tt"); 
  // hh - shows hour and mm - shows minute - tt - shows AM or PM
Jamisco
fonte
10
+ PC.GetHour(datetime) > 11 ? "pm" : "am"

Para o seu exemplo, mas existem maneiras melhores de formatar a data e hora.

Kevin Holditch
fonte
Veja o link que @ChrisF forneceu acima. Basicamente, você pode usar o método ToString no objeto datetime e passá-lo para um formato. Dessa forma, você não chama datetime.ToString várias vezes como no exemplo de código.
Kevin Holditch
2
Por mais feio que isso possa parecer, é uma maneira muito mais simples e consistente do que mexer com culturas diferentes. Por exemplo, muitas culturas mostram a hora em 24 horas e não incluem AM / PM, e o ToString ("tt") produz uma sequência vazia.
Nathanchere
4

Algo como bool isPM = GetHour() > 11. Mas se você quiser formatar uma data para uma sequência, não precisará fazer isso sozinho. Use as funções de formatação de data para isso.

CodesInChaos
fonte
1
Honestamente, eu nem mostraria o método isPM (). A única maneira de formatar legitimamente objetos DateTime é usando os formatadores.
21412 Richfield01
@ richb01 Eu discordo. A única maneira segura é não usar am / pm e usar o formato 24h, sempre anexando a cultura invariável ou manualmente. "am" e "pm" não são preenchidos, por exemplo, no idioma alemão, apenas estão vazios. Se alguém escreve String.Format ( "{0: hh: mm tt}", DateTime.Now) eles simplesmente obter vezes erradas
Christoph
1

Você pode testá-lo desta maneira

Console.WriteLine(DateTime.Now.ToString("tt "));

A saída será assim:

AM

ou

PM
yazarloo
fonte
1
Você sabe que está usando o código da resposta aceita?
Thomas Ayoub
Caro @ThomasAyoub, O código que é escrito é de uma linha da fonte do meu projeto. está funcionando agora.
Yazarloo 30/05
Desculpe, esta é uma resposta muito ruim, especialmente porque a introdução é #Now
Wolf
0

Aqui está uma maneira mais fácil de escrever o formato da hora (hh:mm:ss tt)e exibi-los separadamente, se desejar.

string time = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00") + ":" + DateTime.Now.Second.ToString("00") + DateTime.Now.ToString(" tt");

ou simplesmente:

 DateTime.Now.ToString("hh:mm:ss tt")
Zero
fonte
0

A resposta de Andy é boa. Mas se você quiser mostrar o horário sem formato de 24 horas, poderá seguir desta maneira

string dateTime = DateTime.Now.ToString("hh:mm:ss tt", CultureInfo.InvariantCulture);

Depois disso, você deve ter um horário como "22:35:20" ou "10:35:20"

Mahi Uddin
fonte
-1
string AM_PM = string.Format("{0:hh:mm:ss tt}", DateTime.Now).Split(new char[]{' '})[1];
Shah Bdr
fonte
-2

Aqui está um exemplo de código:

DateTime time = DateTime.Now;
string AM_PM;
AM_PM = time.ToLongTimeString().Substring(time.ToLongTimeString().Length - 2);
Praveen Manupati
fonte
2
Esta não é uma solução confiável. ToLongTimeString()retorna um valor com base na cultura atual do encadeamento. E, diferentemente de algumas das soluções semelhantes fornecidas em outras respostas, esse código nem funcionará se você definir a cultura do thread como InvariantCulture, porque a cultura invariável LongTimePattern- que é o que determina o valor de retorno ToLongTimeString()- é HH:mm:ss.
Joe Farrell