How would I get the GMT of the player?

I tried doing just subtracting the local hour and the universal hour, this worked if the local hour is greater than the universal hour; like on the morning here which is GMT+8, which gave me 8 difference but now it’s midnight it’s giving me 16.

The other one is just using a while loop and just increase the HourDifference by 1 and update the rest of the variable; however this does not work on the western places, since this always give’s me positive number:

local function GetGMTDifference(UniversalTime: DateTime, LocalTime: DateTime)
	local UniversalHour, LocalHour = UniversalTime.Hour, LocalTime.Hour
	local UniversalMinute, LocalMinute = UniversalTime.Minute, LocalTime.Minute
	local HourDifference, MinuteDifference = 0, 0

	while (UniversalHour ~= LocalHour) do
		UniversalHour += 1
		UniversalHour %= 24
		HourDifference += 1
	end

	while (UniversalMinute ~= LocalMinute) do
		UniversalMinute += 1
		UniversalMinute %= SECONDS_IN_MINUTE
		MinuteDifference += 1
	end

	return HourDifference, MinuteDifference
end

So I got something though I’m not sure if this works on the eastern or GMT-, it would be helpful if someone on the other side of the earth would test this out; just copy the code and test it out, if it works and got the same GMT then I conclude this as the solution.

local function GetHourDifference(UniversalHour, LocalHour, IsPositive)
	local HourDifference = 0
	local Amount = (IsPositive) and 1 or -1

	while (UniversalHour ~= LocalHour) do
		UniversalHour += Amount
		UniversalHour %= 24
		HourDifference += Amount
	end

	if (HourDifference > 0) then
		HourDifference = "+"..HourDifference
	end

	return HourDifference
end

local function GetMinuteDifference(UniversalMinute, LocalMinute, IsPositive)
	local MinuteDifference = 0
	local Amount = (IsPositive) and 1 or -1

	while (UniversalMinute ~= LocalMinute) do
		UniversalMinute += Amount
		UniversalMinute %= SECONDS_IN_MINUTE
		MinuteDifference += Amount
	end

	return MinuteDifference
end

local function GetGMTDifference(UniversalTime: DateTime, LocalTime: DateTime)
	local UniversalHour, LocalHour = UniversalTime.Hour, LocalTime.Hour
	local UniversalMinute, LocalMinute = UniversalTime.Minute, LocalTime.Minute
	local HourDifference, MinuteDifference

	local UniversalDay, LocalDay = UniversalTime.Day, LocalTime.Day

	if (LocalDay > UniversalDay) then
		HourDifference = GetHourDifference(UniversalHour, LocalHour, true)
		MinuteDifference = GetMinuteDifference(UniversalMinute, LocalMinute, true)
	elseif (LocalDay < UniversalDay) then
		HourDifference = GetHourDifference(UniversalHour, LocalHour, false)
		MinuteDifference = GetMinuteDifference(UniversalMinute, LocalMinute, false)
	else
		if (LocalHour >= UniversalHour) then
			HourDifference = GetHourDifference(UniversalHour, LocalHour, true)
		else
			HourDifference = GetHourDifference(UniversalHour, LocalHour, false)
		end

		if (LocalMinute >= UniversalMinute) then
			MinuteDifference = GetMinuteDifference(UniversalMinute, LocalMinute, true)
		else
			MinuteDifference = GetMinuteDifference(UniversalMinute, LocalMinute, false)
		end
	end

	return HourDifference, MinuteDifference
end

local Now = DateTime.now()
local LocalTime = Now:ToLocalTime()
local UniversalTime = Now:ToUniversalTime()

print(("GMT%02i:%02i"):format(GetGMTDifference(UniversalTime, LocalTime)))