C# DateTime.ParseExact AM/PM指示器小写

C# DateTime.ParseExact AM/PM指示器小写,c#,datetime,formatting,C#,Datetime,Formatting,考虑以下字符串 var myString = "11/05/2015 01:04:16 p.m." 我可以在此字符串上执行DateTime.ParseExact而不强制使用字符串大写吗?am/pm指示符让我很伤心,因为它是小写的,所以无法解析。我有一个静态类,其中包含格式字符串的常量。是否有用于指定小写am/pm指示器的格式标记 格式化字符串 解析逻辑 您可以在区域性中更改DateFormatInfo的AMDesignator/PMDesignator 此信息为只读,因此,您必须创建自己的区域

考虑以下字符串

var myString = "11/05/2015 01:04:16 p.m."
我可以在此字符串上执行DateTime.ParseExact而不强制使用字符串大写吗?am/pm指示符让我很伤心,因为它是小写的,所以无法解析。我有一个静态类,其中包含格式字符串的常量。是否有用于指定小写am/pm指示器的格式标记

格式化字符串

解析逻辑


您可以在区域性中更改DateFormatInfo的AMDesignator/PMDesignator

此信息为只读,因此,您必须创建自己的区域性:

我还更改了MyDateTimeFormat格式,以便它可以工作:

    public class MyCultureInfo : CultureInfo
    {
        public MyCultureInfo():base(CultureInfo.InvariantCulture.Name)
        {
        }
        public override DateTimeFormatInfo DateTimeFormat
        {
            get
            {
                DateTimeFormatInfo myDateTimeFormatInfo = base.DateTimeFormat;
                myDateTimeFormatInfo.PMDesignator = "p.m.";
                myDateTimeFormatInfo.AMDesignator = "a.m.";
                return myDateTimeFormatInfo;
            }
            set
            {
                base.DateTimeFormat = value;
            }
        }
    }
    public static class MyFormat
    {
        public const string MyDateTimeFormat = "dd/MM/yyyy hh:mm:ss tt";
    }
    static int Main(string[] args)
    {
        var myStringDateValue = "11/05/2015 01:04:16 p.m.";
        var result = DateTime.ParseExact(myStringDateValue, MyFormat.MyDateTimeFormat, new MyCultureInfo());
    }

您可以在区域性中更改DateFormatInfo的AMDesignator/PMDesignator

此信息为只读,因此,您必须创建自己的区域性:

我还更改了MyDateTimeFormat格式,以便它可以工作:

    public class MyCultureInfo : CultureInfo
    {
        public MyCultureInfo():base(CultureInfo.InvariantCulture.Name)
        {
        }
        public override DateTimeFormatInfo DateTimeFormat
        {
            get
            {
                DateTimeFormatInfo myDateTimeFormatInfo = base.DateTimeFormat;
                myDateTimeFormatInfo.PMDesignator = "p.m.";
                myDateTimeFormatInfo.AMDesignator = "a.m.";
                return myDateTimeFormatInfo;
            }
            set
            {
                base.DateTimeFormat = value;
            }
        }
    }
    public static class MyFormat
    {
        public const string MyDateTimeFormat = "dd/MM/yyyy hh:mm:ss tt";
    }
    static int Main(string[] args)
    {
        var myStringDateValue = "11/05/2015 01:04:16 p.m.";
        var result = DateTime.ParseExact(myStringDateValue, MyFormat.MyDateTimeFormat, new MyCultureInfo());
    }

也许是因为上午和下午不是典型的上午和下午。?尝试用am或pm替换p.m.和a.m.或删除输入字符串中的所有。@Ron-我受输入限制。我必须接受上述格式的字符串。希望使用格式字符串保持简单,并且不操纵原始输入字符串。您无法执行DateTime.ParseExactmyStringDateValue.Replace?我不确定日期时间格式字符串是否可以在字符串中指定's,请参见@Ron-据我所知,格式标记't'允许AM/PM指示符使用单个字符,但AM/PM指示符'a'或'P'必须是大写。如果改为使用格式标记“tt”,则AM/PM指示符必须是两个字符宽的“AM”或“PM”,但可以是大写或小写。使用dd/MM/yyyy hh:MM:ss tt格式字符串和我在上面发布的内容,我可以运行您的代码并获得有效日期,而无需更改大小写。可能在format strings类中添加一个解析常量。可能是因为am和pm不是典型的上午和下午。?尝试用am或pm替换p.m.和a.m.或删除输入字符串中的所有。@Ron-我受输入限制。我必须接受上述格式的字符串。希望使用格式字符串保持简单,并且不操纵原始输入字符串。您无法执行DateTime.ParseExactmyStringDateValue.Replace?我不确定日期时间格式字符串是否可以在字符串中指定's,请参见@Ron-据我所知,格式标记't'允许AM/PM指示符使用单个字符,但AM/PM指示符'a'或'P'必须是大写。如果改为使用格式标记“tt”,则AM/PM指示符必须是两个字符宽的“AM”或“PM”,但可以是大写或小写。使用dd/MM/yyyy hh:MM:ss tt格式字符串和我在上面发布的内容,我可以运行您的代码并获得有效日期,而无需更改大小写。也许可以在format strings类中添加一个解析常量。我本来希望能快速生成一个format strings,但这很管用。这也是一个很酷的答案——我从来都不知道我能定义一种定制文化。我也是,直到我看到你的问题;我希望能有一个快速格式化的字符串,但这是可行的。这也是一个很酷的答案——我从来都不知道我能定义一种定制文化。我也是,直到我看到你的问题;
    public class MyCultureInfo : CultureInfo
    {
        public MyCultureInfo():base(CultureInfo.InvariantCulture.Name)
        {
        }
        public override DateTimeFormatInfo DateTimeFormat
        {
            get
            {
                DateTimeFormatInfo myDateTimeFormatInfo = base.DateTimeFormat;
                myDateTimeFormatInfo.PMDesignator = "p.m.";
                myDateTimeFormatInfo.AMDesignator = "a.m.";
                return myDateTimeFormatInfo;
            }
            set
            {
                base.DateTimeFormat = value;
            }
        }
    }
    public static class MyFormat
    {
        public const string MyDateTimeFormat = "dd/MM/yyyy hh:mm:ss tt";
    }
    static int Main(string[] args)
    {
        var myStringDateValue = "11/05/2015 01:04:16 p.m.";
        var result = DateTime.ParseExact(myStringDateValue, MyFormat.MyDateTimeFormat, new MyCultureInfo());
    }