Skip to content

Commit a96050c

Browse files
committed
implement getOffset methods
1 parent 9b7918d commit a96050c

File tree

8 files changed

+34
-3
lines changed

8 files changed

+34
-3
lines changed

builtin-functions/kphp-light/stdlib/time-functions.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ class DateTimeImmutable implements DateTimeInterface {
9898
public function sub(DateInterval $interval): DateTimeImmutable;
9999
public function diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval;
100100
public function format(string $format): string;
101-
/** @kphp-extern-func-info stub generation-required */
102101
public function getOffset(): int;
103102
public function getTimestamp(): int;
104103
}
@@ -123,7 +122,6 @@ class DateTime implements DateTimeInterface {
123122
public function sub(DateInterval $interval): DateTime;
124123
public function diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval;
125124
public function format(string $format): string;
126-
/** @kphp-extern-func-info stub generation-required */
127125
public function getOffset(): int;
128126
public function getTimestamp(): int;
129127
}

runtime-light/stdlib/time/datetime.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ string f$DateTime$$format(const class_instance<C$DateTime>& self, const string&
131131
return str;
132132
}
133133

134+
int64_t f$DateTime$$getOffset(const class_instance<C$DateTime>& self) noexcept {
135+
return kphp::timelib::get_offset(*self->time);
136+
}
137+
134138
int64_t f$DateTime$$getTimestamp(const class_instance<C$DateTime>& self) noexcept {
135139
return kphp::timelib::get_timestamp(*self->time);
136140
}

runtime-light/stdlib/time/datetime.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,6 @@ class_instance<C$DateInterval> f$DateTime$$diff(const class_instance<C$DateTime>
5959

6060
string f$DateTime$$format(const class_instance<C$DateTime>& self, const string& format) noexcept;
6161

62+
int64_t f$DateTime$$getOffset(const class_instance<C$DateTime>& self) noexcept;
63+
6264
int64_t f$DateTime$$getTimestamp(const class_instance<C$DateTime>& self) noexcept;

runtime-light/stdlib/time/datetimeimmutable.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ string f$DateTimeImmutable$$format(const class_instance<C$DateTimeImmutable>& se
169169
return str;
170170
}
171171

172+
int64_t f$DateTimeImmutable$$getOffset(const class_instance<C$DateTimeImmutable>& self) noexcept {
173+
return kphp::timelib::get_offset(*self->time);
174+
}
175+
172176
int64_t f$DateTimeImmutable$$getTimestamp(const class_instance<C$DateTimeImmutable>& self) noexcept {
173177
return kphp::timelib::get_timestamp(*(self->time));
174178
}

runtime-light/stdlib/time/datetimeimmutable.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,6 @@ class_instance<C$DateInterval> f$DateTimeImmutable$$diff(const class_instance<C$
6565

6666
string f$DateTimeImmutable$$format(const class_instance<C$DateTimeImmutable>& self, const string& format) noexcept;
6767

68+
int64_t f$DateTimeImmutable$$getOffset(const class_instance<C$DateTimeImmutable>& self) noexcept;
69+
6870
int64_t f$DateTimeImmutable$$getTimestamp(const class_instance<C$DateTimeImmutable>& self) noexcept;

runtime-light/stdlib/time/timelib-functions.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,25 @@ std::string_view english_suffix(timelib_sll number) noexcept {
174174
return "th";
175175
}
176176

177+
int64_t get_offset(timelib_time& t) noexcept {
178+
if (t.is_localtime) {
179+
switch (t.zone_type) {
180+
case TIMELIB_ZONETYPE_ID: {
181+
time_offset_t offset{(kphp::memory::libc_alloc_guard{}, timelib_get_time_zone_info(t.sse, t.tz_info))};
182+
int64_t offset_int{offset->offset};
183+
return offset_int;
184+
}
185+
case TIMELIB_ZONETYPE_OFFSET: {
186+
return t.z;
187+
}
188+
case TIMELIB_ZONETYPE_ABBR: {
189+
return t.z + (3600 * t.dst);
190+
}
191+
}
192+
}
193+
return 0;
194+
}
195+
177196
timelib_tzinfo* get_timezone_info(const char* timezone) noexcept {
178197
int errc{}; // it's intentionally declared as 'int' since timelib_parse_tzfile accepts 'int'
179198
auto* tzinfo{kphp::timelib::get_timezone_info(timezone, timelib_builtin_db(), std::addressof(errc))};

runtime-light/stdlib/time/timelib-functions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ void set_timestamp(timelib_time& t, int64_t timestamp) noexcept;
7272

7373
std::string_view english_suffix(timelib_sll number) noexcept;
7474

75+
int64_t get_offset(timelib_time& t) noexcept;
76+
7577
timelib_tzinfo* get_timezone_info(const char* timezone) noexcept;
7678
/**
7779
* @brief Retrieves a pointer to a `timelib_tzinfo` structure for a given time zone name.

tests/phpt/datetime/10_get_offset.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@ok k2_skip
1+
@ok
22
<?php
33

44
function test_get_offset() {

0 commit comments

Comments
 (0)