加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 19:09:07 所属栏目:asp.Net 来源:网络整理
导读:如何将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/a
如何将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}Td{2}:d{2}:d{2}.d{3}Z$)}/{endDate:regex(^d{4}-d{2}-d{2}Td{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}Td{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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读