diff src/core/time.cpp @ 9:5c0397762b53

INCOMPLETE: megacommit :)
author Paper <mrpapersonic@gmail.com>
date Sun, 10 Sep 2023 03:59:16 -0400
parents src/time.cpp@1d82f6e04d7d
children fe719c109dbc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/time.cpp	Sun Sep 10 03:59:16 2023 -0400
@@ -0,0 +1,64 @@
+#include "core/time.h"
+#include <cassert>
+#include <cmath>
+#include <cstdint>
+#include <ctime>
+#include <string>
+
+namespace Time {
+
+Duration::Duration(int64_t l) {
+	length = l;
+}
+
+std::string Duration::AsRelativeString() {
+	std::string result;
+
+	auto get = [](int64_t val, const std::string& s, const std::string& p) {
+		return std::to_string(val) + " " + (val == 1 ? s : p);
+	};
+
+	if (InSeconds() < 60)
+		result = get(InSeconds(), "second", "seconds");
+	else if (InMinutes() < 60)
+		result = get(InMinutes(), "minute", "minutes");
+	else if (InHours() < 24)
+		result = get(InHours(), "hour", "hours");
+	else if (InDays() < 28)
+		result = get(InDays(), "day", "days");
+	else if (InDays() < 365)
+		result = get(InDays() / 30, "month", "months");
+	else
+		result = get(InDays() / 365, "year", "years");
+
+	if (length < 0)
+		result = "In " + result;
+	else
+		result += " ago";
+
+	return result;
+}
+
+int64_t Duration::InSeconds() {
+	return length;
+}
+
+int64_t Duration::InMinutes() {
+	return std::llround((double)length / 60.0);
+}
+
+int64_t Duration::InHours() {
+	return std::llround((double)length / 3600.0);
+}
+
+int64_t Duration::InDays() {
+	return std::llround((double)length / 86400.0);
+}
+
+int64_t GetSystemTime() {
+	assert(sizeof(int64_t) >= sizeof(time_t));
+	time_t t = std::time(nullptr);
+	return *reinterpret_cast<int64_t*>(&t);
+}
+
+} // namespace Time
\ No newline at end of file