Skip to content
This repository has been archived by the owner on Dec 1, 2022. It is now read-only.

Get current time with milliseconds precision. #523

Merged
Merged
12 changes: 2 additions & 10 deletions src/common/function/FunctionManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1524,11 +1524,7 @@ FunctionManager::FunctionManager() {
attr.body_ = [](const auto &args) -> Value {
switch (args.size()) {
case 0: {
auto result = time::TimeUtils::utcTime();
if (!result.ok()) {
return Value::kNullBadData;
}
return Value(std::move(result).value());
return Value(time::TimeUtils::utcTime());
}
case 1: {
if (args[0].get().isStr()) {
Expand Down Expand Up @@ -1562,11 +1558,7 @@ FunctionManager::FunctionManager() {
attr.body_ = [](const auto &args) -> Value {
switch (args.size()) {
case 0: {
auto result = time::TimeUtils::utcDateTime();
if (!result.ok()) {
return Value::kNullBadData;
}
return Value(std::move(result).value());
return Value(time::TimeUtils::utcDateTime());
}
case 1: {
if (args[0].get().isStr()) {
Expand Down
65 changes: 35 additions & 30 deletions src/common/time/TimeUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "common/fs/FileUtils.h"
#include "common/time/TimeConversion.h"
#include "common/time/TimezoneInfo.h"
#include "common/time/WallClock.h"

namespace nebula {
namespace time {
Expand Down Expand Up @@ -76,23 +77,19 @@ class TimeUtils {
Timezone::getGlobalTimezone().utcOffsetSecs());
}

static StatusOr<DateTime> localDateTime() {
DateTime dt;
time_t unixTime = std::time(NULL);
if (unixTime == -1) {
return Status::Error("Get unix time failed: %s.", std::strerror(errno));
}
return TimeConversion::unixSecondsToDateTime(unixTime -
Timezone::getGlobalTimezone().utcOffsetSecs());
static DateTime localDateTime() {
auto time = unixTime();
auto dt = TimeConversion::unixSecondsToDateTime(
time.seconds - Timezone::getGlobalTimezone().utcOffsetSecs());
dt.microsec = time.milliseconds * 1000;
return dt;
}

static StatusOr<DateTime> utcDateTime() {
DateTime dt;
time_t unixTime = std::time(NULL);
if (unixTime == -1) {
return Status::Error("Get unix time failed: %s.", std::strerror(errno));
}
return TimeConversion::unixSecondsToDateTime(unixTime);
static DateTime utcDateTime() {
auto time = unixTime();
auto dt = TimeConversion::unixSecondsToDateTime(time.seconds);
dt.microsec = time.milliseconds * 1000;
return dt;
}

static StatusOr<Date> dateFromMap(const Map &m);
Expand Down Expand Up @@ -159,26 +156,34 @@ class TimeUtils {
return TimeConversion::timeShift(time, Timezone::getGlobalTimezone().utcOffsetSecs());
}

static StatusOr<Time> localTime() {
Time dt;
time_t unixTime = std::time(NULL);
if (unixTime == -1) {
return Status::Error("Get unix time failed: %s.", std::strerror(errno));
}
return TimeConversion::unixSecondsToTime(unixTime -
Timezone::getGlobalTimezone().utcOffsetSecs());
static Time localTime() {
auto time = unixTime();
auto t = TimeConversion::unixSecondsToTime(time.seconds -
Timezone::getGlobalTimezone().utcOffsetSecs());
t.microsec = time.milliseconds * 1000;
return t;
}

static StatusOr<Time> utcTime() {
Time dt;
time_t unixTime = std::time(NULL);
if (unixTime == -1) {
return Status::Error("Get unix time failed: %s.", std::strerror(errno));
}
return TimeConversion::unixSecondsToTime(unixTime);
static Time utcTime() {
auto time = unixTime();
auto t = TimeConversion::unixSecondsToTime(time.seconds);
t.microsec = time.milliseconds * 1000;
return t;
}

static StatusOr<Value> toTimestamp(const Value &val);

private:
struct UnixTime {
int64_t seconds{0};
int64_t milliseconds{0};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

here is microseconds

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Milliseconds in fact.

};

// <seconds, milliseconds>
static UnixTime unixTime() {
auto ms = WallClock::fastNowInMilliSec();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can use fastNowInMicroSec directly

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The cypher only provide the milliseconds precision

return UnixTime{ms / 1000, ms % 1000};
}
}; // class TimeUtils

} // namespace time
Expand Down