2

这很奇怪。我有来自 Http GET 的日期格式数据,并使用模型类包装日期。是这样的,

// Model

public class wrapModel
{
  public DateTime mydate{get; set;}
}

和,

// controller
[HttpGet]
public void myController(wrapModel data){
   Response.Write(searchModel.mydate.ToString());
}

并使用浏览器调用控制器,myhost/home/myController/mydate=05/05/2012

然后它打印“5/5/2012 12:00:00 AM”,我预计只在 2012 年 5 月 5 日。

我不需要时间。所以我试图解析日期。

data.mydata = DateTime.parse(data.mydata.ToString("MM/dd/yyyy"));

但它仍然打印“5/5/2012 12:00:00 AM”

如何将格式更改为“2012 年 5 月 5 日”?

有知道的请指教~

谢谢!

我想解析来自 Http GET 的日期时间格式数据。

但我没有改变,也

[编辑]

感谢您的所有回答和您宝贵的时间!但我仍然有问题。请帮我多一点:)

首先,我需要 DateTime 格式的数据,而不是字符串类型,因为我将使用 Linq 中的日期来检索数据库日期。

我试过,

1)

[DisplayFormat(DataFormatString="{0:MM/dd/yyyy}", ApplyFormatInEditMode=true)]
public DateTime mydate { get; set; }

[HttpGet]
public ActionResult myController(wrapModel data){
   return Content(searchModel.mydate.ToString());
}

仍然打印“5/5/2012 12:00:00 AM”

2)

[HttpGet]
public ActionResult myController(wrapModel data){
   return Content(searchModel.mydate.ToString("MM/dd/yyyy"));
}

它也改变了格式,但我需要 DateTime 格式,所以我再次转换为 DateTime。

[HttpGet]
public ActionResult myController(wrapModel data){
   searchModel.mydate = DateTime.Parse(searchModel.mydate.ToString("MM/dd/yyyy"));
   return Content(searchModel.mydate.ToString());
}

然后它再次打印“5/5/2012 12:00:00 AM”。

3)

searchModel.etaDate.ToString("d")

与上面相同,转换为 DateTime 然后打印“5/5/2012 12:00:00 AM”

我使用 Response.Write() 进行简单的返回值测试,但是我不能使用 Response.Write() 方法有什么重要原因吗?我想学习 :)

非常感谢!

[编辑]

我需要为此输入 DateTime 类型的数据,

Repository myRespository = new Respository();

var data = (from x in myRepository.myContext
            where x.thedate == mydate  // thedate is datetime type, so I need datetime type for compare
            select x.no).SingleOrDefault()

我试过,

string test = mydate.ToShortDateString();

(...
where x.thedate.ToString() == test
...)

但它不起作用。

4

5 回答 5

5

如何将格式更改为“2012 年 5 月 5 日”?

您首先必须使用正确的格式传递参数,该格式始终 yyyy-MM-dd适用于 GET 请求:

http://myhost/home/myController/mydate=2012-05-05

我一直强调这个词因为理解这一点非常重要。原因是默认模型绑定器在解析来自 GET 请求的日期时总是使用 InvariantCulture,而在解析来自 POST 请求的日期时它使用当前文化。有一篇很好的文章解释了这一点以及这个设计决定背后的原因。

进而:

Response.Write(searchModel.mydate.ToString("MM/dd/yyyy"));

好吧,实际上,并不是Response.Write因为您从未在 ASP.NET MVC 应用程序中这样做,您宁愿从控制器操作返回一个 ActionResult:

[HttpGet]
public ActionResult MyAction(wrapModel data)
{
    return Content(data.mydate.ToString("MM/dd/yyyy"));
}

或者您将使用以下DisplayFormat属性装饰您的视图模型:

public class wrapModel
{
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime mydate { get; set; }
}

或者如果您想考虑当前的文化短日期格式:

public class wrapModel
{
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    public DateTime mydate { get; set; }
}

然后让您的控制器操作将此模型传递给视图:

public ActionResult MyAction(wrapModel data)
{
    return View(data);
}

当然,在相应的强类型视图中,使用DisplayFor/EditorFor帮助器以所需格式实现所需的输出:

@model wrapModel
<span>
    @Html.DisplayFor(x => x.mydate)
</span>
于 2012-07-08T06:58:26.760 回答
0

采用

datevar.ToShortDateString();
于 2012-07-08T07:02:11.407 回答
0

(注意:Darin 的回答非常适合 MVC。我已经发布了这个以获得更多一般信息。)

但它仍然打印“5/5/2012 12:00:00 AM”

是的,它会的。仅仅因为您解析了一个只有日期的值,所以该DateTime值不知道。那只是一个日期和时间。如果您调用ToString它,它将始终使用当前文化的默认格式。

我强烈建议您避免对字符串进行比您绝对必须做的更多的转换。尽可能早地解析该值,然后将其保留为DateTime内部,直到您绝对必须将其转换回字符串 - 用于无法本DateTime机使用的系统(例如保存到文件)或写入它返回给用户。

如果您要将其写回给用户,则应确保为该用户使用适当的文化,并使用适当的格式字符串 - 例如d“短日期”。虽然您可以使用ToShortDateString,但这不允许您指定文化,而ToString可以:

string text = date.ToString("d", culture);

向用户显示信息的任何地方,我强烈建议使用标准格式:“yyyy-MM-dd”用于日期,“yyyy-MM-dd'T'HH:mm:ss.fffffffK”用于日期/时间值。(后者由o标准格式字符串表示。)

请注意,格式对于日期非常重要。如果你给我看一个显示“08/07/2012”的网页,我不知道是 8 月 7 日还是 7 月 8 日。

于 2012-07-08T07:09:04.257 回答
0

解析后请使用 .ToShortDateString()

于 2012-07-08T07:25:28.407 回答
0

您应该在视图中使用该代码:

item.mydate.Value.ToShortDateString()
于 2015-08-17T21:39:49.227 回答