当前位置: 首页 > 知识库问答 >
问题:

如何传递日期时间参数?

姜志行
2023-03-14

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

传递< code>2010-01-01可以正常工作,但是当我传递一个UTC日期,如< code > 2014-12-31t 22:00:00 . 000 z (带有时间部分)时,我得到一个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,或者至少指定日期和时间?

共有3个答案

张嘉
2023-03-14

我感受到你的痛苦...又一种日期时间格式...正是你需要的!

使用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)

....但是,尽管这适用于一个日期(开始日期),但由于某种原因,当结束日期采用这种格式时,它就不起作用了...调试了几个小时,唯一的线索是异常说它不喜欢冒号“:”(即使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

蓝昊天
2023-03-14

在您的产品 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

日期时间格式:

yyyy-MM-ddTHH:mm:ss

javascript pass 参数使用时刻.js

const dateStart = moment(startDate).format('YYYY-MM-DDTHH:mm:ss');
const dateEnd = moment(endDate).format('YYYY-MM-DDTHH:mm:ss');
申昌勋
2023-03-14

问题是双重的:

默认情况下,IIS将所有带有一个点的URI视为静态资源,尝试返回它并跳过进一步的处理(通过Web API)。这是在您的Web中配置的。在system.webServer一节中进行配置。处理程序:默认处理程序处理<code>路径=*。关于这个<code>路径</code>属性中奇怪的语法,您不会找到太多文档(正则表达式更有意义),但这显然意味着“任何不包含点的东西”(以及下面第2点中的任何字符)。因此,ExtensionlessUrlHandler-Integrated-4.0名称中的“无扩展”。

在我看来,多种解决方案是可能的,按“正确性”的顺序排列:

  • 为必须允许点的路由添加一个新的处理程序。请确保将其添加到默认值之前。要做到这一点,请确保先删除默认处理程序,然后再将其添加回您的处理程序
  • path=“*”属性更改为path=“*”。然后它会抓住一切。请注意,从那时起,您的web api将不再将带有点的传入调用解释为静态资源!如果您在web api上托管静态资源,则不建议这样做
  • 将以下内容添加到您的网站。配置以无条件处理所有请求:在<code>下

更改上述内容后,默认情况下,您会得到以下错误:

一个潜在危险的请求。从客户端检测到路径值(:)。

您可以在Web.config中更改预定义的不允许/无效字符。在

虽然不是您问题的答案,但更安全、更简单的解决方案是更改请求,这样就不需要所有这些了。这可以通过两种方式完成:

  1. 将日期作为查询字符串参数传递,如? date=2012-12-31T22:00:00.000Z
  2. 从每个请求中删除.000。您仍然需要允许s(cfr point 2)。

 类似资料:
  • 我在一个spring MVC项目和spring tools套件中工作,我想把一个日期参数传递给一个原生查询,到目前为止我已经有了这个。 扩展JpaRepository的接口中的查询方法

  • 我在derby数据库上有一个带有日期参数的报告,当通过两个文本字段发送日期以运行i时,我收到了下面的消息,得到了下面的报价错误消息。 线程“AWT-EventQueue-0”中出现异常Java . lang . classcastexception:Java . lang . string不能转换为net . SF . jasperreports . engine . query . jrjdbc

  • 问题内容: 在SQL语句中,如何比较保存为TIMESTAMP的日期和YYYY-MM-DD格式的日期? 例如: 我希望此查询返回指定日期中所有带有时间戳的行,但它仅返回具有午夜时间戳的行。 谢谢 问题答案: 您可以使用该函数提取时间戳记的日期部分: 但是,如果您在timestamp列上有索引,则这样做会更快,因为它可以利用索引:

  • 问题内容: 我正在尝试创建以start_date和end_date为参数的 JR 报告。 查询: 代码: 我们可以将两个参数传递到表中的同一列吗?例如: 问题答案: 您的代码是错误的。 您应该传递如下参数: 您无需添加 到参数名称。 JasperReports 分发包中有很多示例。 您可以查看此样本以获取更多详细信息。

  • 问题内容: 您如何使用jquery和mvc3将日期时间(我需要第二个)传递给c#。这就是我所拥有的 我无法弄清楚日期应采用哪种格式,以便C#理解。 问题答案: 以下格式应该可以工作:

  • 问题内容: 我有一个日期时间格式的字段,当日期更好并且与数据库的其余部分更一致时,我想进行转换。无论如何,时间部分都是00:00:00。 如何在MySQL中做到这一点? 谢谢。 问题答案: 如果要在-Statement中使用,请使用运算符: 如果要在结构上更改表,只需将数据类型更改为(当然,只有在不影响依赖于此字段的应用程序的情况下,才这样做)。 两者都将消除时间部分。