首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何传递datetime参数?

如何传递datetime参数?
EN

Stack Overflow用户
提问于 2013-01-16 21:28:14
回答 10查看 216.5K关注 0票数 105

如何将UTC日期传递到Web API?

传递2010-01-01可以很好地工作,但是当我传递一个UTC date,比如2014-12-31T22:00:00.000Z (带有一个time组件)时,我得到一个HTTP404响应。所以

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

会产生404错误响应,而

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

工作正常。

如何将UTC日期传递给Web API,然后-或者至少指定日期和时间?

EN

回答 10

Stack Overflow用户

发布于 2017-03-09 20:59:52

在产品Web API控制器中:

[RoutePrefix("api/product")]
public class ProductController : ApiController
{
    private readonly IProductRepository _repository;
    public ProductController(IProductRepository repository)
    {
        this._repository = repository;
    }

    [HttpGet, Route("orders")]
    public async Task<IHttpActionResult> GetProductPeriodOrders(string productCode, DateTime dateStart, DateTime dateEnd)
    {
        try
        {
            IList<Order> orders = await _repository.GetPeriodOrdersAsync(productCode, dateStart.ToUniversalTime(), dateEnd.ToUniversalTime());
            return Ok(orders);
        }
        catch(Exception ex)
        {
            return NotFound();
        }
    }
}

在Fiddler -Composer中测试GetProductPeriodOrders方法:

http://localhost:46017/api/product/orders?productCode=100&dateStart=2016-12-01T00:00:00&dateEnd=2016-12-31T23:59:59

DateTime格式:

yyyy-MM-ddTHH:mm:ss

使用moment.js javascript传递参数

const dateStart = moment(startDate).format('YYYY-MM-DDTHH:mm:ss');
const dateEnd = moment(endDate).format('YYYY-MM-DDTHH:mm:ss');
票数 31
EN

Stack Overflow用户

发布于 2014-03-01 13:22:55

我能感受到你的痛苦。还有另一种日期时间格式...这正是您所需要的!

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

因此,有了类和方法上的属性,您就可以使用您遇到问题的这种utc格式编写REST URL (显然是它的ISO8601,大概是使用startDate.toISOString()实现的)。

[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

票数 19
EN

Stack Overflow用户

发布于 2019-07-02 20:22:42

作为与s k的答案类似的替代方案,我能够在查询字符串中传递由Date.prototype.toISOString()格式化的日期。这是标准的ISO8601格式,无需对路由或操作进行任何额外配置,即可被.Net Web API控制器接受。

例如:

var dateString = dateObject.toISOString(); // "2019-07-01T04:00:00.000Z"
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14359566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档