Skip to content

Commit 422db12

Browse files
authored
Merge pull request #416 from keboola/jv-fix-datetime-format
[internal-api-client] Fix datetime timezone offset format
2 parents ef54fbe + 950f40a commit 422db12

File tree

2 files changed

+69
-12
lines changed

2 files changed

+69
-12
lines changed

src/JobFactory/Job.php

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class Job implements JsonSerializable, JobInterface
2929
{
3030
private ?DateTimeImmutable $endTime;
3131
private ?DateTimeImmutable $startTime;
32+
private ?DateTimeImmutable $createdTime = null;
3233
private ?string $tokenDecrypted = null;
3334
private ?string $executionTokenDecrypted = null;
3435
private ?array $componentConfigurationDecrypted = null;
@@ -50,21 +51,19 @@ public function __construct(
5051

5152
$this->data['isFinished'] = in_array($this->getStatus(), JobInterface::STATUSES_FINISHED);
5253
$this->data['parentRunId'] = $this->getParentRunId();
54+
5355
$this->startTime = null;
5456
$this->endTime = null;
55-
try {
56-
if (!empty($this->data['startTime'])) {
57-
$this->startTime = new DateTimeImmutable($this->data['startTime'], new DateTimeZone('utc'));
58-
}
59-
} catch (Throwable $e) {
60-
// intentionally empty
57+
58+
if (!empty($this->data['startTime'])) {
59+
$this->startTime = $this->data['startTime'] = $this->createNormalizedDatetime($this->data['startTime']);
6160
}
62-
try {
63-
if (!empty($this->data['endTime'])) {
64-
$this->endTime = new DateTimeImmutable($this->data['endTime'], new DateTimeZone('utc'));
65-
}
66-
} catch (Throwable $e) {
67-
// intentionally empty
61+
if (!empty($this->data['endTime'])) {
62+
$this->endTime = $this->data['endTime']= $this->createNormalizedDatetime($this->data['endTime']);
63+
}
64+
if (!empty($this->data['createdTime'])) {
65+
$this->createdTime = $this->data['createdTime'] =
66+
$this->createNormalizedDatetime($this->data['createdTime']);
6867
}
6968
}
7069

@@ -420,4 +419,19 @@ private function getStorageClientWrapper(): ClientWrapper
420419
new ClientOptions(null, $this->getTokenDecrypted(), $this->getBranchId()),
421420
);
422421
}
422+
public function getCreatedTime(): ?DateTimeImmutable
423+
{
424+
return $this->createdTime;
425+
}
426+
427+
private function createNormalizedDatetime(string $datetimeString): ?DateTimeImmutable
428+
{
429+
try {
430+
$date = new DateTimeImmutable($datetimeString, new DateTimeZone('utc'));
431+
$timezoneOffset = $date->format('P'); // e.g. Z => +00:00
432+
return $date->setTimezone(new DateTimeZone($timezoneOffset));
433+
} catch (Throwable) {
434+
return null;
435+
}
436+
}
423437
}

tests/JobFactory/JobTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Keboola\JobQueueInternalClient\Tests\JobFactory;
66

7+
use DateTimeImmutable;
78
use Keboola\JobQueueInternalClient\Exception\ClientException;
89
use Keboola\JobQueueInternalClient\JobFactory;
910
use Keboola\JobQueueInternalClient\JobFactory\Job;
@@ -1017,4 +1018,46 @@ public function testGetExecutionTokenDecryptedNoFeature(): void
10171018

10181019
self::assertSame('token', $executionToken);
10191020
}
1021+
1022+
public static function provideDatetimeStrings(): iterable
1023+
{
1024+
yield 'endTime - MySQL offset' => [
1025+
'datetimeString' => '2024-06-11T10:11:37+00:00',
1026+
'timeField' => 'endTime',
1027+
];
1028+
yield 'endTime - Elastic offset' => [
1029+
'datetimeString' => '2024-06-11T10:11:37.000Z',
1030+
'timeField' => 'endTime',
1031+
];
1032+
yield 'startTime - MySQL offset' => [
1033+
'datetimeString' => '2024-06-11T10:11:37+00:00',
1034+
'timeField' => 'startTime',
1035+
];
1036+
yield 'startTime - Elastic offset' => [
1037+
'datetimeString' => '2024-06-11T10:11:37.000Z',
1038+
'timeField' => 'startTime',
1039+
];
1040+
yield 'createdTime - MySQL offset' => [
1041+
'datetimeString' => '2024-06-11T10:11:37+00:00',
1042+
'timeField' => 'createdTime',
1043+
];
1044+
yield 'createdTime - Elastic offset' => [
1045+
'datetimeString' => '2024-06-11T10:11:37.000Z',
1046+
'timeField' => 'createdTime',
1047+
];
1048+
}
1049+
1050+
/** @dataProvider provideDatetimeStrings */
1051+
public function testTimeGetters(string $datetimeString, string $timeField): void
1052+
{
1053+
$jobData = $this->jobData;
1054+
$getterMethodName = 'get' . ucfirst($timeField);
1055+
self::assertNull($this->getJob($jobData)->$getterMethodName());
1056+
1057+
$jobData[$timeField] = $datetimeString;
1058+
$job = $this->getJob($jobData);
1059+
1060+
self::assertEquals(new DateTimeImmutable('2024-06-11T10:11:37+00:00'), $job->$getterMethodName());
1061+
self::assertEquals('+00:00', $job->$getterMethodName()->getTimezone()->getName());
1062+
}
10201063
}

0 commit comments

Comments
 (0)