php-rrule icon indicating copy to clipboard operation
php-rrule copied to clipboard

Support for floating/local time

Open chris-rs opened this issue 5 years ago • 7 comments

Hi,

According to the RFC 5545 DTSTART can also be defined in local (floating) time. This means that no timezone information will be appended to the DTSTART field. When I assign a datetime to DTSTART (in format 2019-08-20 17:00:00) the UTC timezone will still be appended (by 'Z'). Does this package support floating times for DTSTART?

Regards, Chris

chris-rs avatar Aug 20 '19 15:08 chris-rs

Does this package support floating times for DTSTART?

Hi @chris-rs,

Yes! More info:

  • creation: https://github.com/rlanvin/php-rrule/wiki/RRule#creation-from-a-string
  • export to a RFC String: https://github.com/rlanvin/php-rrule/wiki/RRule#rfcstringinclude_timezone--true

Feel free to close the ticket if that answered your question, or provide more details if something is not working for you.

rlanvin avatar Aug 20 '19 17:08 rlanvin

Thanks @rlanvin for the fast and helpful response! Is there a way to put the local datetime in the rrule without requiring the false argument (rfcString(false))? I just tried:

$rule = new \RRule\RRule([
  'FREQ' => 'WEEKLY',
  'BYDAY' => ['MO','TU','WE','TH','FR','SA','SU'],
  'DTSTART' => Carbon::today()->setTime(10,0,0)->toDateTimeLocalString()
]);

But RRule still assigns Zulu timezone to DTSTART when I do $rule->rfcString()

chris-rs avatar Aug 21 '19 14:08 chris-rs

Well no, the lib needs a timezone to perform the calculations. Besides, the results are returned as DateTime objects, which contain a timezone as well. There is no way to NOT have a timezone internally. So if you don't provide one, the current PHP default timezone will be used (in your case, your PHP is configured with UTC I guess).

What is the problem exactly with rfcString(false)?

rlanvin avatar Aug 21 '19 19:08 rlanvin

@rlanvin events can be floating or bound to a timezone. So I should decide about the argument per event. The rfcString() is called just before the response is sent. I want to avoid putting logical rules at this place and keep this place solely responsible for generating output.

chris-rs avatar Aug 22 '19 09:08 chris-rs

So if I understand your problem correctly, essentially you want to keep track of whether or not a particular instance was created with a "floating time" in order for rfcString() to behave differently when no argument is passed?

rlanvin avatar Aug 23 '19 20:08 rlanvin

Yes, keeping track of floating times could be part of the RRule object since DTSTART is in a format with or without timezone info. For now I solved it by keeping track of floating times in own Event object (which contains RRule).

chris-rs avatar Aug 27 '19 14:08 chris-rs

I would have done the same, it's a good workaround. Leaving this ticket open, I'll see if I can add something in the lib itself.

rlanvin avatar Aug 27 '19 19:08 rlanvin