最初コミット
このコミットが含まれているのは:
コミット
436ccb7ea9
|
@ -0,0 +1,2 @@
|
|||
zig-out
|
||||
zig-cache
|
|
@ -0,0 +1,27 @@
|
|||
const std = @import("std");
|
||||
|
||||
pub fn build(b: *std.Build) void {
|
||||
const target = b.standardTargetOptions(.{});
|
||||
|
||||
const optimize = b.standardOptimizeOption(.{});
|
||||
|
||||
const lib = b.addStaticLibrary(.{
|
||||
.name = "toki",
|
||||
.root_source_file = .{ .path = "src/main.zig" },
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
});
|
||||
|
||||
b.installArtifact(lib);
|
||||
|
||||
const main_tests = b.addTest(.{
|
||||
.root_source_file = .{ .path = "src/main.zig" },
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
});
|
||||
|
||||
const run_main_tests = b.addRunArtifact(main_tests);
|
||||
|
||||
const test_step = b.step("test", "Run library tests");
|
||||
test_step.dependOn(&run_main_tests.step);
|
||||
}
|
|
@ -0,0 +1,137 @@
|
|||
const std = @import("std");
|
||||
const testing = std.testing;
|
||||
|
||||
const DateTime = struct {
|
||||
year: u64,
|
||||
month: u64,
|
||||
day: u64,
|
||||
hour: u64,
|
||||
minute: u64,
|
||||
second: u64,
|
||||
};
|
||||
|
||||
fn getDaysInMonth(year: u64) [12]u64 {
|
||||
var daysInMonth = [_]u64{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||
|
||||
if (isLeapYear(year)) {
|
||||
daysInMonth[1] += 1;
|
||||
}
|
||||
|
||||
return daysInMonth;
|
||||
}
|
||||
|
||||
fn calculateYearAndDayOfYear(days: u64) struct { year: u64, dayOfYear: u64 } {
|
||||
var year: u64 = 1970;
|
||||
var d = days;
|
||||
while (true) {
|
||||
var daysInThisYear: u64 = if (isLeapYear(year)) 366 else 365;
|
||||
if (d < daysInThisYear) break;
|
||||
d -= daysInThisYear;
|
||||
year += 1;
|
||||
}
|
||||
|
||||
return .{ .year = year, .dayOfYear = d };
|
||||
}
|
||||
|
||||
fn isLeapYear(year: u64) bool {
|
||||
return (year % 4 == 0) and ((year % 100 != 0) or (year % 400 == 0));
|
||||
}
|
||||
|
||||
fn declareDateVars(seconds: u64) DateTime {
|
||||
var dt = DateTime{
|
||||
.second = @mod(seconds, 60),
|
||||
.minute = (@as(u64, seconds) / 60) % 60,
|
||||
.hour = (seconds / 60 / 60) % 24,
|
||||
.day = 0,
|
||||
.month = 0,
|
||||
.year = 0,
|
||||
};
|
||||
|
||||
var days = seconds / 60 / 60 / 24;
|
||||
|
||||
var yearAndDayOfYear = calculateYearAndDayOfYear(days);
|
||||
var year: u64 = yearAndDayOfYear.year;
|
||||
var dayOfYear: u64 = yearAndDayOfYear.dayOfYear;
|
||||
|
||||
var month: u64 = 0;
|
||||
var daysInMonth = getDaysInMonth(year);
|
||||
|
||||
while (dayOfYear >= daysInMonth[month]) {
|
||||
dayOfYear -= daysInMonth[month];
|
||||
month += 1;
|
||||
}
|
||||
|
||||
dt.month = month + 1;
|
||||
dt.day = dayOfYear + 1;
|
||||
dt.year = year;
|
||||
return dt;
|
||||
}
|
||||
|
||||
pub fn unixToDateTime(timestamp: u64) DateTime {
|
||||
const seconds: u64 = timestamp;
|
||||
return declareDateVars(seconds);
|
||||
}
|
||||
|
||||
pub fn dateTimeToUnix(dateTime: DateTime) u64 {
|
||||
var totalSeconds: u64 = 0;
|
||||
totalSeconds += dateTime.second;
|
||||
totalSeconds += dateTime.minute * 60;
|
||||
totalSeconds += dateTime.hour * 60 * 60;
|
||||
totalSeconds += (dateTime.day - 1) * 24 * 60 * 60;
|
||||
|
||||
var daysInMonth = getDaysInMonth(dateTime.year);
|
||||
var i: u64 = 0;
|
||||
while (i < dateTime.month - 1) {
|
||||
totalSeconds += daysInMonth[i] * 24 * 60 * 60;
|
||||
i += 1;
|
||||
}
|
||||
|
||||
var j: u64 = 1970;
|
||||
while (j < dateTime.year) {
|
||||
if (isLeapYear(j)) totalSeconds += 366 * 24 * 60 * 60 else totalSeconds += 365 * 24 * 60 * 60;
|
||||
j += 1;
|
||||
}
|
||||
|
||||
return totalSeconds;
|
||||
}
|
||||
|
||||
pub fn nanoToSecond(nano: u64) u64 {
|
||||
var sec: u64 = @divTrunc(nano, 1_000_000_000);
|
||||
return sec;
|
||||
}
|
||||
|
||||
test "test nanoToSecond" {
|
||||
try testing.expect(nanoToSecond(1690514984429000696) == 1690514984);
|
||||
}
|
||||
|
||||
test "test unixToDateTime" {
|
||||
var timestamp: u64 = 1633639452;
|
||||
var result = unixToDateTime(timestamp);
|
||||
|
||||
if (result.year != 2021) std.debug.panic("エラー:unixToDateTime.year = {}\n", .{result.year});
|
||||
try testing.expect(result.year == 2021);
|
||||
if (result.month != 10) std.debug.panic("エラー:unixToDateTime.month = {}\n", .{result.month});
|
||||
try testing.expect(result.month == 10);
|
||||
if (result.day != 7) std.debug.panic("エラー:unixToDateTime.day = {}\n", .{result.day});
|
||||
try testing.expect(result.day == 7);
|
||||
if (result.hour != 20) std.debug.panic("エラー:unixToDateTime.hour = {}\n", .{result.hour});
|
||||
try testing.expect(result.hour == 20);
|
||||
if (result.minute != 44) std.debug.panic("エラー:unixToDateTime.minute = {}\n", .{result.minute});
|
||||
try testing.expect(result.minute == 44);
|
||||
if (result.second != 12) std.debug.panic("エラー:unixToDateTime.second = {}\n", .{result.second});
|
||||
try testing.expect(result.second == 12);
|
||||
}
|
||||
|
||||
test "test dateTimeToUnix" {
|
||||
var timestamp: DateTime = .{
|
||||
.year = 2021,
|
||||
.month = 10,
|
||||
.day = 7,
|
||||
.hour = 20,
|
||||
.minute = 44,
|
||||
.second = 12,
|
||||
};
|
||||
var result = dateTimeToUnix(timestamp);
|
||||
if (result != 1633639452) std.debug.panic("エラー:dateTimeToUnix= {}\n", .{result});
|
||||
try testing.expect(result == 1633639452);
|
||||
}
|
読み込み中…
新しいイシューから参照