【问题标题】:Date conversion ( c#,Asp.net MVC)日期转换 (c#,Asp.net MVC)
【发布时间】:2016-03-16 08:44:21
【问题描述】:

我正在尝试在我的 asp.net mvc 网络应用上转换 DateTime 的格式。

我有这个代码:

date = Request["date"].AsDateTime().ToString("MM-dd-yyyy HH:mm:ss");

当 Request["date"] 仅作为一天的一位数字时,该代码可以完美运行
(如 08-03-2016)但是当日期有两位数字日期时 (如 2016 年 3 月 15 日),

它返回 01-01-0001... 有人能解释一下为什么并告诉我如何让它变得更好吗?

提前致谢!

编辑:

我正在使用的更多代码:

用于日期选择的 Javascript 日期选择器:

<script>
    $(document).ready(function() {
        $('.date').datepicker({ dateFormat: "dd/mm/yy" });
    });
</script>

格式代码:

    String date = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 0, 0, 0).ToString("dd/MM/yyyy HH:mm:ss");

string[] formats = { "dd-MM-yyyy" };
DateTime resultDate = new DateTime();
if (DateTime.TryParseExact(Request["date"], formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out resultDate))
            {
                //if everything good you will have your date in resultDate variable
                date = resultDate.ToString("MM-dd-yyyy HH:mm:ss");
            }

【问题讨论】:

  • 很可能是因为.AsDateTime() 扩展方法使用MM-dd-yyyy 的文化解析数据 - 11-03-2016 有效吗?
  • 为什么要从 Request 对象中读取查询参数,而不是使用操作参数?为什么要使用本地化格式而不是例如。 2015-03-15 哪个可以明确解析?
  • 那个参数是从哪里来的?如果您将其更改为 ISO 格式,您甚至可以在您的操作方法中使用 DateTime 类型的参数
  • @StephenMuecke 是的 11-03-2016 正在工作
  • @PanagiotisKanavos 我正在使用该请求,因为我在视图中使用了 javascript 日期选择器,这就是日期的来源。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 datetime


【解决方案1】:

.AsDateTime() 使用当前机器文化的方法(这取决于您的应用程序App.ConfigWeb.Config)。

如果你 100% 确定你的日期是 dd-MM-yyyy 格式,你可以这样分配:

DateTime.ParseExact(Request["date"], "dd-MM-yyyy", CultureInfo.InvariantCulture)
.ToString("MM-dd-yyyy HH:mm:ss");

正如 Stephen Muecle 所说,最好使用 DateTime.TryParseExact() 方法:

//here you can define more that one format to parce
string[] formats = { "dd-MM-yyyy"};
DateTime resultDate = new DateTime();
if (DateTime.TryParseExact(Request["date"], formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out resultDate))
{
    //if everything good you will have your date in resultDate variable
    date = resultDate.ToString("MM-dd-yyyy HH:mm:ss"); 
}
else
{ 
    //here the logic if parce fails
}

好吧,正如 Panagiotis Kanavos 所说,对文化进行硬编码并不是一个好主意。如果你想把事情做好,就应该应对全球化。

在您的Web.Config 中,您应该设置uiCultureculture

<globalization uiCulture="en-GB" culture="en-GB" />

然后,当您初始化 jquery ui datepicker 时,您应该设置当前文化。像这样的:

$('.datepicker').datepicker({ dateFormat: '@System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern' });

如果您在Web.Config 中设置全球化,您的整个应用程序文化将同步,您甚至可以使用.AsDateTime()

【讨论】:

  • TryParseExact() 会更好地避免任何潜在的异常。
  • 硬编码日期格式是个坏主意。最好使用标准的 YYYY-MM-DD 格式
  • @StephenMuecke 实际上会更糟,因为即使日期文字无效,它也允许处理 - 除非使用正确的处理代码(例如检查缺失的无效值)
  • @PanagiotisKanavos,如果您使用TryParseExact(),您可以在使用.ToString()之前测试结果
  • @PanagiotisKanavos 同意最好使用标准格式。但是,如果您必须本地化您的应用程序,您必须在所有应用程序中同步您的文化,并从 System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern 获取您的格式。
【解决方案2】:

试试这个:

DateTime unformattedDate;
if(DateTime.TryParse(Request["date"], out unformattedDate)
{
   DateTime formattedDate = unformattedDate.ToString("MM-dd-yyyy HH:mm:ss");
}

【讨论】:

  • 为什么不会以完全相同的方式失败?
【解决方案3】:

试试这个:

DateTime date = new DateTime();
date = (DateTime)Request["date"];
String myDate=date.ToString();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2015-04-16
    • 2017-07-28
    • 2011-12-10
    相关资源
    最近更新 更多