Comment puis-je obtenir la valeur AM / PM d'un DateTime?

204

Le code en question est ci-dessous:

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()
    + " "
    ????????????????
}

comment puis-je obtenir le AM ​​/ PM de la dateTimevaleur?

SilverLight
la source
24
Il existe de bien meilleures façons de formater un DateTimeque cela. Voir msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF
Utilisez simplementdateTime.ToString("tt");
David Jesus

Réponses:

368

Que diriez-vous:

dateTime.ToString("tt", CultureInfo.InvariantCulture);
Andy
la source
3
Vous devez ajouter un nouveau System.Globalization.CultureInfo ("en-US") pour obtenir ce droit (si vous n'exécutez pas déjà le thread dans un contexte américain)
thomas
1
@thomas - Bon point. Modifié maintenant pour spécifierCultureInfo.InvariantCulture
Andy
8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
IndieTech Solutions
Ceci pour obtenir AM / PM à partir de la date. Mais si je veux changer AM à PM à n'importe quelle date. Alors que dois-je faire?
Ajay Sharma
2
@AjaySharma Il suffit d'ajouter 12 heures avant l'évaluation du format. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM
107
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

Cela devrait vous donner la valeur de chaîne de l'heure. tt devrait annexer le am / pm.

Vous pouvez également consulter le sujet associé:

Comment obtenez-vous l'heure actuelle?

XikiryoX
la source
8
Cela devrait être en minuscules hhcar votre représentation actuelle sort en 24 heures avec am et pm, ce qui est un peu inutile
Pas aimé le
1
@LukeMcGregor J'ai modifié la réponse selon votre suggestion.
Docteur Jones
46

Le DateTimedevrait toujours être en interne dans le calendrier "américain" (grégorien). Donc si tu le fais

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

vous devriez obtenir ce que vous voulez en beaucoup moins de lignes.

xanatos
la source
33

Très simple en utilisant le format chaîne

sur .ToSTring("") :

  • si vous utilisez "hh" - >> L'heure, en utilisant une horloge de 12 heures de 01 à 12.

  • si vous utilisez "HH" - >> L'heure, en utilisant une horloge de 24 heures de 00 à 23.

  • si vous ajoutez "tt" - >> L'indicateur Am / Pm.

exemple de conversion de 23h12 à 23h12:

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();

attendez une seconde ce n'est pas tout ce dont vous avez besoin pour vous soucier d'autre chose est le système Culture car le même code exécuté sur des fenêtres avec un autre langage spécialement avec un langage de culture différent générera un résultat différent avec le même code

exemple de fenêtres réglées sur la culture de langue arabe montrera comme ça:

// 23:12 م

م signifie Soir (premier leter de مساء).

dans un autre système, la culture dépend de ce qui est défini sur l'option régionale et linguistique de windows, il affichera // 23:12 du.

vous pouvez changer entre différents formats sur le panneau de configuration de Windows sous windows régional et langue -> format actuel (combobox) et changer ... appliquez-le faites une reconstruction (exécutez) de votre application et regardez ce dont je parle.

Alors, qui puis-je forcer à afficher les mots Am et Pm en anglais si la culture du système actuel n'est pas définie sur l'anglais?

facile simplement en ajoutant deux lignes: ->

la première étape ajouter using System.Globalization;au-dessus de votre code

et en modifiant le code précédent pour qu'il ressemble à ceci:

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 => en utilisant le format anglais par défaut.

une autre question, je veux que le pm soit en arabe ou dans une langue spécifique, même si j'utilise des fenêtres définies au format régional anglais (ou autre langue)?

Soution pour l'arabe Exemple:

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

cela montrera // 23:12 م

événement si mon système est défini sur un format de région anglais. vous pouvez changer "ar-AE" si vous voulez un autre format de langue. il y a une liste de chaque langue et son format.

exemples:

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

big list...

faites-moi savoir si vous avez une autre question.

Bilal
la source
Si je veux voir "23h12"? Je pense que votre réponse est incomplète.
Fjodr
18

Je sais que cela peut sembler extrêmement tardif .. mais cela peut aider quelqu'un

Je voulais obtenir la partie AM PM de la date, alors j'ai utilisé ce qu'Andy a conseillé:

dateTime.ToString("tt");

J'ai utilisé cette partie pour construire un chemin pour enregistrer mes fichiers .. J'ai construit mes hypothèses que j'obtiendrai AM ou PM et rien d'autre !!

cependant quand j'ai utilisé un PC dont sa culture n'est pas anglaise .. (dans mon cas ARABE) .. mon application a échoué car le format "tt" a renvoyé quelque chose de nouveau pas AM ni PM (م ou ص) ..

Le correctif a donc été d'ignorer la culture en ajoutant le deuxième argument comme suit:

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

.. bien sûr, vous devez ajouter: using System.Globalization; au-dessus du fichier ur j'espère que cela aidera quelqu'un :)

rechercheSO
la source
3
Merci d'avoir ajouté cela car cela m'a aidé aujourd'hui - je recevais AM sur mon environnement de développement et AM sur un serveur distant et il n'y avait pas énormément d'aide de Google avec lui jusqu'à ce que je lise ce post. Même Dotnetpearls déclare "Il n'y a pas de périodes dans la sortie de tt. Si vous avez besoin de périodes dans votre AM ou PM, vous devrez manipuler la chaîne." Ce qui bien sûr était complètement faux dans mon cas ...
KiwiSunGoddess
13

c'est assez simple

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

Pour votre exemple, mais il existe de meilleures façons de formater datetime.

Kevin Holditch
la source
Voir le lien que @ChrisF a donné ci-dessus. Fondamentalement, vous pouvez utiliser la méthode ToString sur l'objet datetime et lui passer un format. De cette façon, vous n'appelez pas plusieurs fois datetime.ToString comme vous le faites dans votre exemple de code.
Kevin Holditch
2
Aussi laid que cela puisse paraître, c'est une manière beaucoup plus simple et plus cohérente que de jouer avec différentes cultures. Par exemple, de nombreuses cultures affichent l'heure en 24 heures et n'incluent pas du tout AM / PM, et ToString ("tt") produit une chaîne vide.
nathanchere
4

Quelque chose comme bool isPM = GetHour() > 11. Mais si vous souhaitez formater une date en une chaîne, vous ne devriez pas avoir à le faire vous-même. Utilisez les fonctions de formatage de la date pour cela.

CodesInChaos
la source
1
Honnêtement, je ne montrerais même pas la méthode isPM (). La seule façon de formater légitimement les objets DateTime est d'utiliser les formateurs.
richb01
@ richb01 Je ne suis pas d'accord. Le seul moyen sûr est de ne pas utiliser du tout am / pm et d'utiliser le format 24h, toujours ajouter la culture invariante ou le faire manuellement. "am" et "pm" ne sont pas remplis, par exemple en allemand, il est juste vide. Si quelqu'un écrit String.Format ("{0: hh: mm tt}", DateTime.Now), il se trompe tout simplement
Christoph
1

Vous pouvez le tester de cette façon

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

La sortie sera comme ceci:

AM

ou

PM
yazarloo
la source
1
Savez-vous que vous utilisez le code de la réponse acceptée?
Thomas Ayoub
Cher @ThomasAyoub, Le code qui est écrit provient d'une ligne de ma source de projet. cela fonctionne en ce moment.
yazarloo
Désolé, c'est une très mauvaise réponse, surtout parce que l'introductionNow
Wolf
0

Voici un moyen plus simple d'écrire le format de l'heure (hh:mm:ss tt)et de les afficher séparément si vous le souhaitez.

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

ou tout simplement:

 DateTime.Now.ToString("hh:mm:ss tt")
Zéro
la source
0

@ La réponse d'Andy est OK. Mais si vous voulez afficher l'heure sans format 24 heures, vous pouvez suivre comme ça

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

Après cela, vous devriez avoir du temps comme "10:35:20 PM" ou "10:35:20 AM"

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

Voici un exemple de code:

DateTime time = DateTime.Now;
string AM_PM;
AM_PM = time.ToLongTimeString().Substring(time.ToLongTimeString().Length - 2);
Praveen Manupati
la source
2
Ce n'est pas une solution fiable. ToLongTimeString()renvoie une valeur basée sur la culture de thread actuelle. Et contrairement à certaines des solutions similaires données dans d'autres réponses, ce code ne fonctionnera même pas si vous définissez la culture de thread sur InvariantCulture, car la culture invariante LongTimePattern- qui détermine la valeur de retour de ToLongTimeString()- est HH:mm:ss.
Joe Farrell