मैं आपका दर्द महसूस करता हूं ... फिर भी एक और तारीख समय प्रारूप ... बस आपको क्या चाहिए!
वेब एपि 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)
.... लेकिन, हालांकि यह एक तारीख (आरंभ) के साथ काम करता है, किसी कारण से यह काम नहीं करता है जब एंडेडेट इस प्रारूप में होता है ... घंटों के लिए डीबग किया जाता है, केवल सुराग यह कहता है कि यह बृहदान्त्र की तरह नहीं है ":" (यहां तक कि हालाँकि web.config के साथ सेट किया गया है:
<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="" />
</system.web>
तो, एक और तारीख प्रारूप बनाने की अनुमति देता है (आईएसओ तिथि प्रारूप के लिए पॉलीफ़िल से लिया गया है) और इसे जावास्क्रिप्ट तिथि में जोड़ें (संक्षिप्तता के लिए, केवल मिनट तक परिवर्तित करें):
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';
};
}());
}
फिर जब आप वेब एपीआई 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);
...
}
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
हंसेलमैन कुछ संबंधित जानकारी यहां देता है:
http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx
http://domain/api/controller/action/2012-12-31T22%3A00%3A00.000Z