0

我来自印度,在这里我们遵循dd-mm-yyyy日期格式。

我的问题是,我们的各种客户需要他们的日期时间以上述格式显示。但是我们用作后端的 SQL Server 不将 dd-mm-yyyy 识别为有效的日期时间格式。我们通常做的是将给定的日期转换为 mm-dd-yyyyCultureInfo使用Convert.ToDateTime() or DateTime.Parse or DateTime.TryParse()

另外,我遇​​到了另一种情况,当我的输入日期格式正确MM-dd-yyyy or MM/dd/yyyy or yyyy-MM-dd,但我的本地系统日期不是上面的,那么it throws exception, input string in not in correct format。我无法弄清楚如何自动解决它。

现有的自定义方法:但这在大多数情况下都会失败。

 /// <summary>
    /// Parses string value from a supplied value to DateTime.
    /// Usage: var i = Common.ParseDate(yourDateString);
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    private static DateTime ParseDate(string value)
    {
        DateTime i;
        if (!DateTime.TryParse(value, out i))
            return Convert.ToDateTime("01/01/1700",CultureInfo.InvariantCulture); 
// Assuming 01/01/1700 as default value instead of null.
        return i;
    }

请建议在上面进行更改,以便我的方法会自动将任何日期时间转换为 SQL Server 兼容格式,如 yyyy-mm-dd。

用法应该是这样的:

Input:
DateTime dt = DateTimeParser("29-12-2013"); // in case or double figure months and dates

Output of dt: either 2013-12-29 or 12/29/2013

DateTime dt = DateTimeParser("9-2-2013"); // in case or single figure months and dates

Output of dt: either 2013-2-9 or 2/9/2013 (sql-server compatible)

请注意:日期时间转换应该与系统时钟无关。

提前致谢

4

5 回答 5

1

我曾经想要这个确切的东西,尽管我们可以假设用户的意思,因为正确性并不重要(对于像 MS Excel 这样的东西,当你输入文本日期时间时)。

实际上,您可以从内置文化中收集所有可能的日期时间格式,以及您可以自己定义的许多自定义格式。我曾经想要一个非常全面的日期时间格式匹配。

我做了一些与nawfal 的回答非常相似的事情。这是一个将他的答案与我的大量格式相结合的解决方案:

static string[] GetDateTimeFormats()
{
    var defaultFormats = CultureInfo.GetCultures(CultureTypes.AllCultures)
                                    .SelectMany(x => x.DateTimeFormat.GetAllDateTimePatterns())
                                    .Distinct(); //to speed up things

    //discard some formats that're not worthy of consideration
    var goodDefaultFormats = defaultFormats.Where(x => !IsPoorFormat(x) && !IsConflictingFormat(x));

    var customFormats = GetCustomDateTimeFormats();

    var allFormats = goodDefaultFormats.Concat(customFormats).ToArray();

    //a technique to get comma separated time formats, 
    //for eg, from dd-MM-yyyy h:mm:ss tt we get -> dd-MM-yyyy, h:mm:ss tt
    var moreCustomFormats = allFormats.Select(f => new 
                                      { 
                                          f, 
                                          i = f.IndexOf(" h", StringComparison.OrdinalIgnoreCase) 
                                      })
                                      .Where(x => x.i >= 0)
                                      .Select(x => new { x.f, c = x.f[x.i - 1], x.i })
                                      .Where(x => !char.IsPunctuation(x.c) && x.c != 't')
                                      .Select(x => x.f.Insert(x.i, ","));

    allFormats = allFormats.Union(moreCustomFormats).ToArray(); //Union removes duplicates

    return allFormats;
}

static bool IsPoorFormat(string format)
{
    //all discardable formats in case any
    string[] ignorables = { "HH", "MMMM yyyy", "MMMM, yyyy", "yyyy MMMM", "yyyy.M", "yyyy-MM", 
                            "MMMM,yy", "MMMM, yy", "MMMM,yyyy", "MMMM, yyyy", "yyyy. MMMM" };

    return ignorables.Contains(format);
}

//to remove conflicting date formats, for example, 
//formats like MM-dd-yy, yy-MM-dd, dd-MM-yy etc can be conflicting
static bool IsConflictingFormat(string format)
{
    //in this example we discard formats like M-d-yy, yy-MM-dd etc, but keep dd-MM-yy
    //in case you want to keep MM-dd-yy, the placeholders array should be { 'd', 'y' },
    //and similarly if the preferred format is yy-MM-dd, array should be { 'M', 'd' }
    var placeholders = new[] { 'M', 'y' };

    var separators = new[] { ' ', '.', '-', '/' };

    var patterns = placeholders.Select(x => x.ToString())
                               .SelectMany(x => new[] { x, x + x })
                               .SelectMany(x => separators, (x, y) => x + y);

    return patterns.Any(format.StartsWith);
}

static string[] GetCustomDateTimeFormats()
{
    return new[] 
    {
        "dddd, MMMM d, yyyy h:mm:ss tt",
        "dddd, MMMM d, yyyy H:mm:ss",
        "dddd, MMMM d, yyyy h:mm tt",
        "dddd, MMMM d, yyyy H:mm",

        "dddd, MMM d, yyyy h:mm:ss tt",
        "dddd, MMM d, yyyy H:mm:ss",
        "dddd, MMM d, yyyy h:mm tt",
        "dddd, MMM d, yyyy H:mm",

        "ddd, MMMM d, yyyy h:mm:ss tt",
        "ddd, MMMM d, yyyy H:mm:ss",
        "ddd, MMMM d, yyyy h:mm tt",
        "ddd, MMMM d, yyyy H:mm",

        "ddd, MMM d, yyyy h:mm:ss tt",
        "ddd, MMM d, yyyy H:mm:ss",
        "ddd, MMM d, yyyy h:mm tt",
        "ddd, MMM d, yyyy H:mm",



        "dddd, MMMM d yyyy h:mm:ss tt",
        "dddd, MMMM d yyyy H:mm:ss",
        "dddd, MMMM d yyyy h:mm tt",
        "dddd, MMMM d yyyy H:mm",

        "dddd, MMM d yyyy h:mm:ss tt",
        "dddd, MMM d yyyy H:mm:ss",
        "dddd, MMM d yyyy h:mm tt",
        "dddd, MMM d yyyy H:mm",

        "ddd, MMMM d yyyy h:mm:ss tt",
        "ddd, MMMM d yyyy H:mm:ss",
        "ddd, MMMM d yyyy h:mm tt",
        "ddd, MMMM d yyyy H:mm",

        "ddd, MMM d yyyy h:mm:ss tt",
        "ddd, MMM d yyyy H:mm:ss",
        "ddd, MMM d yyyy h:mm tt",
        "ddd, MMM d yyyy H:mm", 

        ///////////////////////////

        "dddd, d MMMM, yyyy h:mm:ss tt", 
        "dddd, d MMMM, yyyy H:mm:ss", 
        "dddd, d MMMM, yyyy h:mm tt", 
        "dddd, d MMMM, yyyy H:mm", 

        "dddd, d MMM, yyyy h:mm:ss tt", 
        "dddd, d MMM, yyyy H:mm:ss", 
        "dddd, d MMM, yyyy h:mm tt", 
        "dddd, d MMM, yyyy H:mm", 

        "ddd, d MMMM, yyyy h:mm:ss tt", 
        "ddd, d MMMM, yyyy H:mm:ss", 
        "ddd, d MMMM, yyyy h:mm tt", 
        "ddd, d MMMM, yyyy H:mm", 

        "ddd, d MMM, yyyy h:mm:ss tt", 
        "ddd, d MMM, yyyy H:mm:ss", 
        "ddd, d MMM, yyyy h:mm tt", 
        "ddd, d MMM, yyyy H:mm", 



        "dddd, d MMMM yyyy h:mm:ss tt", 
        "dddd, d MMMM yyyy H:mm:ss", 
        "dddd, d MMMM yyyy h:mm tt", 
        "dddd, d MMMM yyyy H:mm", 

        "dddd, d MMM yyyy h:mm:ss tt", 
        "dddd, d MMM yyyy H:mm:ss", 
        "dddd, d MMM yyyy h:mm tt", 
        "dddd, d MMM yyyy H:mm", 

        "ddd, d MMMM yyyy h:mm:ss tt", 
        "ddd, d MMMM yyyy H:mm:ss", 
        "ddd, d MMMM yyyy h:mm tt", 
        "ddd, d MMMM yyyy H:mm", 

        "ddd, d MMM yyyy h:mm:ss tt", 
        "ddd, d MMM yyyy H:mm:ss", 
        "ddd, d MMM yyyy h:mm tt", 
        "ddd, d MMM yyyy H:mm", 

        /////////////////////////////////

        "yyyy, MMMM d h:mm:ss tt", 
        "yyyy, MMMM d H:mm:ss", 
        "yyyy, MMMM d h:mm tt", 
        "yyyy, MMMM d H:mm", 

        "yyyy, MMM d h:mm:ss tt", 
        "yyyy, MMM d H:mm:ss", 
        "yyyy, MMM d h:mm tt", 
        "yyyy, MMM d H:mm", 

        "yyyy, MM d h:mm:ss tt", 
        "yyyy, MM d H:mm:ss", 
        "yyyy, MM d h:mm tt", 
        "yyyy, MM d H:mm", 



        "yyyy MMMM d h:mm:ss tt", 
        "yyyy MMMM d H:mm:ss", 
        "yyyy MMMM d h:mm tt", 
        "yyyy MMMM d H:mm", 

        "yyyy MMM d h:mm:ss tt", 
        "yyyy MMM d H:mm:ss", 
        "yyyy MMM d h:mm tt", 
        "yyyy MMM d H:mm", 

        "yyyy MM d h:mm:ss tt", 
        "yyyy MM d H:mm:ss", 
        "yyyy MM d h:mm tt", 
        "yyyy MM d H:mm", 

        ///////////////////////

        "yyyy, d MMMM h:mm:ss tt", 
        "yyyy, d MMMM H:mm:ss", 
        "yyyy, d MMMM h:mm tt", 
        "yyyy, d MMMM H:mm", 

        "yyyy, d MMM h:mm:ss tt", 
        "yyyy, d MMM H:mm:ss", 
        "yyyy, d MMM h:mm tt", 
        "yyyy, d MMM H:mm", 

        "yyyy, d MM h:mm:ss tt", 
        "yyyy, d MM H:mm:ss", 
        "yyyy, d MM h:mm tt", 
        "yyyy, d MM H:mm", 



        "yyyy d MMMM h:mm:ss tt", 
        "yyyy d MMMM H:mm:ss", 
        "yyyy d MMMM h:mm tt", 
        "yyyy d MMMM H:mm", 

        "yyyy d MMM h:mm:ss tt", 
        "yyyy d MMM H:mm:ss", 
        "yyyy d MMM h:mm tt", 
        "yyyy d MMM H:mm", 

        "yyyy d MM h:mm:ss tt", 
        "yyyy d MM H:mm:ss", 
        "yyyy d MM h:mm tt", 
        "yyyy d MM H:mm",

        ////////////////////////////////

        "MMMM d, yyyy h:mm:ss tt",
        "MMMM d, yyyy H:mm:ss",
        "MMMM d, yyyy h:mm tt",
        "MMMM d, yyyy H:mm",

        "MMM d, yyyy h:mm:ss tt",
        "MMM d, yyyy H:mm:ss",
        "MMM d, yyyy h:mm tt",
        "MMM d, yyyy H:mm",



        "MMMM d yyyy h:mm:ss tt",
        "MMMM d yyyy H:mm:ss",
        "MMMM d yyyy h:mm tt",
        "MMMM d yyyy H:mm",

        "MMM d yyyy h:mm:ss tt",
        "MMM d yyyy H:mm:ss",
        "MMM d yyyy h:mm tt",
        "MMM d yyyy H:mm",

        ////////////////////////////////////

        "d MMMM, yyyy h:mm:ss tt", 
        "d MMMM, yyyy H:mm:ss", 
        "d MMMM, yyyy h:mm tt",
        "d MMMM, yyyy H:mm",  

        "d MMM, yyyy h:mm:ss tt", 
        "d MMM, yyyy H:mm:ss", 
        "d MMM, yyyy h:mm tt",
        "d MMM, yyyy H:mm",  



        "d MMMM yyyy h:mm:ss tt", 
        "d MMMM yyyy H:mm:ss", 
        "d MMMM yyyy h:mm tt",
        "d MMMM yyyy H:mm",  

        "d MMM yyyy h:mm:ss tt", 
        "d MMM yyyy H:mm:ss", 
        "d MMM yyyy h:mm tt",
        "d MMM yyyy H:mm",  

        /////////////////////////

        "dddd, MMMM d, yyyy",
        "dddd, MMM d, yyyy",

        "ddd, MMMM d, yyyy",
        "ddd, MMM d, yyyy",



        "dddd, MMMM d yyyy", 
        "dddd, MMM d yyyy",

        "ddd, MMMM d yyyy",
        "ddd, MMM d yyyy",

        //////////////////////////

        "dddd, d MMMM, yyyy", 
        "dddd, d MMM, yyyy", 

        "ddd, d MMMM, yyyy", 
        "ddd, d MMM, yyyy",  



        "dddd, d MMMM yyyy",
        "dddd, d MMM yyyy",

        "ddd, d MMMM yyyy", 
        "ddd, d MMM yyyy", 

        ///////////////////////////

        "MMMM d, yyyy",
        "MMM d, yyyy",

        "MMMM d yyyy",
        "MMM d yyyy",

        //////////////////////////

        "d MMMM, yyyy", 
        "d MMM, yyyy",

        "d MMMM yyyy", 
        "d MMM yyyy",

        //////////////////////////

        "yyyy, MMMM d", 
        "yyyy, MMM d", 

        "yyyy MMMM d", 
        "yyyy MMM d", 

        //////////////////////////

        "yyyy d MMMM", 
        "yyyy d MMM", 

        "yyyy, d MMMM", 
        "yyyy, d MMM", 

        ///////////////////////////

        "d MMMM",
        "d MMM",

        /////////////////////////////

        "MMMM d", 
        "MMM d",

        ////////////////////////////

        "dd",
    };
}
于 2014-01-29T02:58:23.870 回答
0

我个人使用参数。否则,您可以在 SQL Server 中强制使用特定的 DateTime 格式

于 2013-04-25T10:02:25.427 回答
0

试试这个代码如果你的输入日期是“dd/mm/yyyy”,那么它会转换 Sql 兼容格式,否则它会给你消息日期格式不是预期的格式。

 var dd = string.Empty;
    var mm = string.Empty;
    var yy = string.Empty;
    string actualDate = "18/07/2012";
    string finalDate = string.Empty;
    if (actualDate.ToString().Contains('/'))
    {
        dd = string.Format("{0:00}", Convert.ToInt32(actualDate.ToString().Split('/')[0]));
        mm = string.Format("{0:00}", Convert.ToInt32(actualDate.ToString().Split('/')[1]));
        yy = string.Format("{0:0000}", Convert.ToInt32(actualDate.ToString().Split('/')[2]));
        finalDate = dd + "/" + mm + "/" + yy;
    }

    string dateString = finalDate; // <-- Valid
    string format = "dd/MM/yyyy";
    DateTime dateTime;
    if (!DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture,
        DateTimeStyles.None, out dateTime))
    {
       lblDate.Text= "Excel Date is not correct format.it should be in dd/mm/yyyy";
    }
    else
    {
        actualDate =
            DateTime.ParseExact(dateString, format,
                                   CultureInfo.InvariantCulture,
                                   DateTimeStyles.None).ToString();
    }

    Label1.Text = actualDate;
于 2013-05-03T13:03:11.887 回答
0

您不需要将日期解析为格式。使用DateTimeSQL Server 中的数据类型作为字段,与格式无关。还要确保在通过 C# 与 SQL Server 交互时使用SqlParameter 。DateTime格式只能用于显示日期。喜欢:

using(SqlConnection conn = new SqlConnection("connectionstring"))
using (SqlCommand cmd = new SqlCommand())
{
    cmd.CommandText = "Insert into yourtable(datecolumn) VALUES (@pDate);";
    cmd.Parameters.AddWithValue("@pDate", DateTime.Now);
    cmd.Connection = conn;
    //.....
}
于 2013-04-25T10:00:52.020 回答
0

正如 Habib 所说,要将其保存在数据库中,您不需要知道任何格式,只需保存DateTime对象,您的 ado.net 连接器就会知道如何处理它。

您的问题应该在于将用户的输入字符串解析为 .NETDateTime对象。现在不知道用户的文化特定设置,你注定要失败。你不能有一个通用的方法来处理它。考虑 date 12/12/12,它可能意味着dd/MM/yyMM/dd/yy任何其他组合。


您最好的选择是获取有关用户、他的文化的信息并进行相应的解析。或者要求他以您特别指定的格式输入。


好吧,你可以依靠一些启发式来匹配常见的格式,假设格式但它完全脆弱。仅当准确性不成问题时,这才可以派上用场

private static DateTime ParseOrDefault(string value)
{
    DateTime result;
    var sett = DateTimeStyles.AllowWhiteSpaces; //and whatever that is
    var formats = GetDateTimeFormats //whatever cultures that you want to consider.
    (
        new CultureInfo("en-GB"), //prioritize your order
        new CultureInfo("en-IN"), 
        CultureInfo.CurrentCulture, 
        CultureInfo.InvariantCulture
    );

    if (!DateTime.TryParseExact(value, formats, CultureInfo.InvariantCulture, sett, out result))
        return Convert.ToDateTime("01/01/1700", CultureInfo.InvariantCulture);

    return result;
}

string[] GetDateTimeFormats(params CultureInfo[] cultures)
{
    return cultures.SelectMany(x => x.DateTimeFormat.GetAllDateTimePatterns())
                   .Distinct()
                   .ToArray();
}

DateTime.ParseExactDateTime.TryParseExact具有重载以实现对多种格式的匹配。上述方法假设来自用户的输入字符串首先是在en-GBen-IN文化中,即如果12/12/12它把它当作dd/MM/yy。这是一些假设,但在不知道输入的情况下您可以得到尽可能接近的结果,而您唯一的选择就是假设。谨慎。

像这样称呼它:

Common.ParseOrDefault(yourDateString);

另一种选择可能是您匹配您知道的所有可能的格式,不包括冲突的格式。例如,如果您只想考虑dd/MM/yy可以过滤掉的格式MM/dd/yyyy/MM/dd格式。现在您可以获得大量格式并避免冲突。可以稍微好一点。

static string[] formats; //made static for performance reasons

private static DateTime ParseOrDefault(string value)
{
    formats = formats ?? GetDateTimeFormats();

    DateTime result;
    var sett = DateTimeStyles.AllowWhiteSpaces; //and whatever that is

    if (!DateTime.TryParseExact(value, formats, CultureInfo.InvariantCulture, sett, out result))
        return Convert.ToDateTime("01/01/1700", CultureInfo.InvariantCulture);

    return result;
}

static string[] GetDateTimeFormats()
{
    var allFormats = CultureInfo.GetCultures(CultureTypes.AllCultures)
                                .SelectMany(x => x.DateTimeFormat.GetAllDateTimePatterns())
                                .Distinct(); //to speed up things

    //discard some formats that're not worthy of consideration
    var goodFormats = allFormats.Where(x => !IsConflictingFormat(x));

    return goodFormats.ToArray();
}

//to remove conflicting date formats, for example, 
//formats like MM-dd-yy, yy-MM-dd, dd-MM-yy etc can be conflicting
static bool IsConflictingFormat(string format)
{
    //in this example we discard formats like M-d-yy, yy-MM-dd etc, but keep dd-MM-yy
    //in case you want to keep MM-dd-yy, the placeholders array should be { 'd', 'y' },
    //and similarly if the preferred format is yy-MM-dd, array should be { 'M', 'd' }
    var placeholders = new[] { 'M', 'y' };

    var separators = new[] { ' ', '.', '-', '/' };

    var patterns = placeholders.Select(x => x.ToString())
                               .SelectMany(x => new[] { x, x + x })
                               .SelectMany(x => separators, (x, y) => x + y);

    return patterns.Any(format.StartsWith);
}
于 2014-01-23T05:30:03.080 回答