asp.net – 如何传递datetime参数?

前端之家收集整理的这篇文章主要介绍了asp.net – 如何传递datetime参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何将UTC日期传递到Web API?

传递2010-01-01工作正常,但当我通过UTC日期,如2014-12-31T22:00:00.000Z(有时间组件),我得到一个HTTP 404响应。所以

http://domain/api/controller/action/2012-12-31T22:00:00.000Z

产生404错误响应,而

http://domain/api/controller/action/2012-12-31

工作正常。

如何将UTC日期传递到Web API然后 – 或至少指定日期和时间?

解决方法

我感觉你的痛苦…另一个日期时间格式…只是你需要的!

使用Web Api 2,您可以使用路由属性指定参数。

所以使用您的类和您的方法属性,您可以使用您遇到麻烦的utc格式(显然是它的ISO8601,可能是使用startDate.toISOString()到达)编码一个REST URL,

[Route(@"daterange/{startDate:regex(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$)}/{endDate:regex(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$)}")]
    [HttpGet]
    public IEnumerable<MyRecordType> GetByDateRange(DateTime startDate,DateTime endDate)

….但是,虽然这个工作与一个日期(startDate),由于某些原因,它不工作,当endDate是这种格式…调试小时,只有线索是异常说它不喜欢冒号“:”(甚至虽然web.config设置为:

<system.web>
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="" />
</system.web>

所以,让另一个日期格式(从ISO日期格式的polyfill取得),并将其添加到Javascript日期(为了简洁,只能转换为分钟):

if (!Date.prototype.toUTCDateTimeDigits) {
    (function () {

        function pad(number) {
            if (number < 10) {
                return '0' + number;
            }
            return number;
        }

        Date.prototype.toUTCDateTimeDigits = function () {
            return this.getUTCFullYear() +
              pad(this.getUTCMonth() + 1) +
              pad(this.getUTCDate()) +
              'T' +
              pad(this.getUTCHours()) +
              pad(this.getUTCMinutes()) +
              'Z';
        };

    }());
}

然后,当您将日期发送到Web API 2方法时,可以将它们从字符串转换为日期:

[RoutePrefix("api/myrecordtype")]
public class MyRecordTypeController : ApiController
{


    [Route(@"daterange/{startDateString}/{endDateString}")]
    [HttpGet]
    public IEnumerable<MyRecordType> GetByDateRange([FromUri]string startDateString,[FromUri]string endDateString)
    {
        var startDate = BuildDateTimeFromYAFormat(startDateString);
        var endDate = BuildDateTimeFromYAFormat(endDateString);
    ...
    }

    /// <summary>
    /// Convert a UTC Date String of format yyyyMMddThhmmZ into a Local Date
    /// </summary>
    /// <param name="dateString"></param>
    /// <returns></returns>
    private DateTime BuildDateTimeFromYAFormat(string dateString)
    {
        Regex r = new Regex(@"^\d{4}\d{2}\d{2}T\d{2}\d{2}Z$");
        if (!r.IsMatch(dateString))
        {
            throw new FormatException(
                string.Format("{0} is not the correct format. Should be yyyyMMddThhmmZ",dateString)); 
        }

        DateTime dt = DateTime.ParseExact(dateString,"yyyyMMddThhmmZ",CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal);

        return dt;
    }

所以url会的

http://domain/api/myrecordtype/daterange/20140302T0003Z/20140302T1603Z

Hanselman在这里给出一些相关信息:

http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx

猜你在找的asp.Net相关文章