I was wondering why the date format was different between some fields. My rule is declared like this:
@Name("measurement_occupation")
context ParkingSpotOccupation
insert into CreateMeasurement
select
e.source as source,
"ParkingSpotOccupation" as type,
min(e.time) as time,
{
"startDate", min(e.time),
"endDate", max(e.time),
"duration", dateDifferenceInSec(max(e.time), min(e.time))
} as fragments
from
SmartParkingEvent e
output
last when terminated;
And the result is the following using the API measurements:
{
"time": "2016-05-30T06:00:00.000+02:00",
"id": "33200",
"self": "https://management.post-iot.lu/measurement/measurements/33200",
"source": {
"id": "26932",
"self": "https://management.post-iot.lu/inventory/managedObjects/26932"
},
"type": "ParkingSpotOccupation",
"startDate": {
"time": 1464580800000,
"minutes": 0,
"seconds": 0,
"hours": 6,
"month": 4,
"timezoneOffset": -120,
"year": 116,
"day": 1,
"date": 30
},
"duration": 600,
"endDate": {
"time": 1464581400000,
"minutes": 10,
"seconds": 0,
"hours": 6,
"month": 4,
"timezoneOffset": -120,
"year": 116,
"day": 1,
"date": 30
}
}
Why ate time and startDate/endDate rendered differently? Even stranger, when the output of my event processig rule is displayed it is formatted as follows:
{ "time": { "date": 30, "day": 1, "hours": 6, "minutes": 0, "month": 4, "seconds": 0, "time": 1464580800000, "timezoneOffset": -120, "year": 116 }, "source": "26932", "fragments": [ "startDate", { "date": 30, "day": 1, "hours": 6, "minutes": 0, "month": 4, "seconds": 0, "time": 1464580800000, "timezoneOffset": -120, "year": 116 }, "endDate", { "date": 30, "day": 1, "hours": 6, "minutes": 10, "month": 4, "seconds": 0, "time": 1464581400000, "timezoneOffset": -120, "year": 116 }, "duration", 600 ], "type": "ParkingSpotOccupation" }
So every date looks the same, but not when I use the API to access the measurements. I'd like all the dates to be stored in this format: "2016-05-30T06:00:00.000+02:00". I also tried to use cast(min(e.time), Date) but I got an error (Class as listed in cast function by name 'Date' cannot be loaded). And I tried the toDate() function but it didn't change anything.
The issue is that in Esper all the dates are actually Date class in Java and when parsing it you get this not so nice structure.
Easiest way is to format it to ISO string yourself. You can use the Java SimpleDateFormat. Declare it in the module.
create constant variable SimpleDateFormat ISO_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
and then just use it
ISO_FORMATTER.format(min(e.time))
ISO_FORMATTER.format(max(e.time))
and it returns the ISO String of the date