有问题的代码如下:

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

如何从dateTime值中获得AM/PM ?


当前回答

我知道这似乎有点晚了。然而,它可能会帮助一些人

我想要得到约会的上午下午部分,所以我使用了安迪的建议:

dateTime.ToString("tt");

我用那部分构造了一个路径来保存我的文件。 我建立了我的假设,我将得到AM或PM,没有其他!!

然而,当我使用PC时,它的文化不是英语。(对我来说是阿拉伯语)..我的应用程序失败,因为格式“tt”返回一些新的不是AM或PM (م或ص)..

所以解决这个问题的方法是忽略文化,添加第二个参数,如下所示:

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

.. 当然你必须加上:使用System.Globalization;在你的文件上面 我希望这能帮助到一些人:)

其他回答

@Andy的回答是ok。但如果你想显示时间而不是24小时格式,你可以这样做

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

之后,你应该得到“10:35:20 PM”或“10:35:20 AM”这样的时间

比如bool isPM = GetHour() > 11。但如果您想将日期格式化为字符串,则不需要自己执行此操作。使用日期格式函数。

+ PC.GetHour(datetime) > 11 ? "pm" : "am"

对于你的例子,但是有更好的方法格式化datetime。

您可以用这种方法进行测试

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

输出如下所示:

AM

or

PM

另一种选择是更改用于获得正确格式的默认区域性。这样做的好处是,新格式将在整个代码中使用。

CultureInfo.CurrentCulture = new CultureInfo("Fr-fr");
Console.WriteLine(DateTime.Now.ToString("t")); // 14:08

var customCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
customCulture.DateTimeFormat.AMDesignator = "am";
customCulture.DateTimeFormat.PMDesignator = "pm";
customCulture.DateTimeFormat.ShortTimePattern = "HH:mm tt";
CultureInfo.CurrentCulture = customCulture;

Console.WriteLine(DateTime.Now.ToString("t")); // 14:08 pm