将 DateTime 值转换为最终幻想 XIV Eorzea 游戏时间
Convert DateTime value to Final Fantasy XIV Eorzea Game Time
我最近在网上找到了以下代码,它给出了 FFXIV 的游戏时间(Eorzea 时间):
var E_TIME = 20.5714285714;
var global = {
utcTime: null,
eorzeaTime: null
};
window.setInterval(updateClock, Math.floor(1000 * 60 / E_TIME));
function updateClock() {
global.utcTime = new Date().getTime();
var eo_timestamp = Math.floor(global.utcTime * E_TIME);
global.eorzeaTime = new Date();
global.eorzeaTime.setTime(eo_timestamp);
showTime();
}
function showTime() {
var d = new Date();
d.setTime(global.eorzeaTime);
var eTime = document.getElementById('e-time');
var hours = d.getUTCHours();
var ampm = hours > 11 ? "PM" : "AM";
if(hours > 12)
hours -= 12;
hours = padLeft(hours);
var minutes = d.getUTCMinutes();
minutes = padLeft(minutes);
eTime.innerHTML = hours + ":" + minutes + " " + ampm;
}
function padLeft(val){
var str = "" + val;
var pad = "00";
return pad.substring(0, pad.length - str.length) + str;
}
updateClock();
注意:我不相信该代码,我不是原始编码器,它是在这里找到的:http://jsfiddle.net/jryansc/6r85j/
我想做的是在 C# 中获得相同的结果(时间方面),不幸的是我是编程新手,目前我只知道一些 C#。这就是我寻求帮助的原因,我尝试在 C# 中操作 DateTime 和 TimeSpan,但它似乎不像 JavaScript 中那样容易(根据上面的代码)。
有人可以帮我转换一下代码吗?
非常感谢所有帮助。
假设你的问题是 'How do I calculate Eorzea time in C#':
Javascript 的时间 class 基于纪元时间(自 00:00 1/1/1970 以来经过的时间)。当您乘以 Time() 对象时,您乘以自该日期以来经过的秒数。
.NET 的 DateTime class 不支持简单的乘法运算符 Javascript,但它很容易复制。您需要计算自 1970 年 1 月 1 日以来经过了多少刻度、秒、分钟(无论您喜欢什么),然后将该数字乘以 20.5714285714,然后转换回 DateTime。
在我的示例中,我使用的是刻度而不是秒。
const double EORZEA_MULTIPLIER = 3600D / 175D; //175 Earth seconds for every 3600 Eorzea seconds
// Calculate how many ticks have elapsed since 1/1/1970
long epochTicks = DateTime.UtcNow.Ticks - (new DateTime(1970, 1, 1).Ticks);
// Multiply that value by 20.5714285714...
long eorzeaTicks = (long)Math.Round(epochTicks * EORZEA_MULTIPLIER);
var eorzeaTime = new DateTime(eorzeaTicks);
为了使事情变得更简单,您可以创建一个 DateTime 扩展方法:
public static class EorzeaDateTimeExtention
{
public static DateTime ToEorzeaTime(this DateTime date)
{
const double EORZEA_MULTIPLIER = 3600D/175D;
long epochTicks = date.ToUniversalTime().Ticks - (new DateTime(1970, 1, 1).Ticks);
long eorzeaTicks = (long)Math.Round(epochTicks * EORZEA_MULTIPLIER);
return new DateTime(eorzeaTicks);
}
}
这将允许您将任何日期转换为 Eorzea 时间,只需:
var eorzeaTimeNow = DateTime.Now.ToEorzeaTime();
或
var eorzeaSpecificTime = new DateTime(2014,5,12,5,0,0).ToEorzeaTime();
提示:确保您的 PC 时钟设置准确...我发现这段代码晚了几分钟,直到我意识到我的时钟晚了几秒钟。 :)
我最近在网上找到了以下代码,它给出了 FFXIV 的游戏时间(Eorzea 时间):
var E_TIME = 20.5714285714;
var global = {
utcTime: null,
eorzeaTime: null
};
window.setInterval(updateClock, Math.floor(1000 * 60 / E_TIME));
function updateClock() {
global.utcTime = new Date().getTime();
var eo_timestamp = Math.floor(global.utcTime * E_TIME);
global.eorzeaTime = new Date();
global.eorzeaTime.setTime(eo_timestamp);
showTime();
}
function showTime() {
var d = new Date();
d.setTime(global.eorzeaTime);
var eTime = document.getElementById('e-time');
var hours = d.getUTCHours();
var ampm = hours > 11 ? "PM" : "AM";
if(hours > 12)
hours -= 12;
hours = padLeft(hours);
var minutes = d.getUTCMinutes();
minutes = padLeft(minutes);
eTime.innerHTML = hours + ":" + minutes + " " + ampm;
}
function padLeft(val){
var str = "" + val;
var pad = "00";
return pad.substring(0, pad.length - str.length) + str;
}
updateClock();
注意:我不相信该代码,我不是原始编码器,它是在这里找到的:http://jsfiddle.net/jryansc/6r85j/
我想做的是在 C# 中获得相同的结果(时间方面),不幸的是我是编程新手,目前我只知道一些 C#。这就是我寻求帮助的原因,我尝试在 C# 中操作 DateTime 和 TimeSpan,但它似乎不像 JavaScript 中那样容易(根据上面的代码)。
有人可以帮我转换一下代码吗?
非常感谢所有帮助。
假设你的问题是 'How do I calculate Eorzea time in C#':
Javascript 的时间 class 基于纪元时间(自 00:00 1/1/1970 以来经过的时间)。当您乘以 Time() 对象时,您乘以自该日期以来经过的秒数。
.NET 的 DateTime class 不支持简单的乘法运算符 Javascript,但它很容易复制。您需要计算自 1970 年 1 月 1 日以来经过了多少刻度、秒、分钟(无论您喜欢什么),然后将该数字乘以 20.5714285714,然后转换回 DateTime。
在我的示例中,我使用的是刻度而不是秒。
const double EORZEA_MULTIPLIER = 3600D / 175D; //175 Earth seconds for every 3600 Eorzea seconds
// Calculate how many ticks have elapsed since 1/1/1970
long epochTicks = DateTime.UtcNow.Ticks - (new DateTime(1970, 1, 1).Ticks);
// Multiply that value by 20.5714285714...
long eorzeaTicks = (long)Math.Round(epochTicks * EORZEA_MULTIPLIER);
var eorzeaTime = new DateTime(eorzeaTicks);
为了使事情变得更简单,您可以创建一个 DateTime 扩展方法:
public static class EorzeaDateTimeExtention
{
public static DateTime ToEorzeaTime(this DateTime date)
{
const double EORZEA_MULTIPLIER = 3600D/175D;
long epochTicks = date.ToUniversalTime().Ticks - (new DateTime(1970, 1, 1).Ticks);
long eorzeaTicks = (long)Math.Round(epochTicks * EORZEA_MULTIPLIER);
return new DateTime(eorzeaTicks);
}
}
这将允许您将任何日期转换为 Eorzea 时间,只需:
var eorzeaTimeNow = DateTime.Now.ToEorzeaTime();
或
var eorzeaSpecificTime = new DateTime(2014,5,12,5,0,0).ToEorzeaTime();
提示:确保您的 PC 时钟设置准确...我发现这段代码晚了几分钟,直到我意识到我的时钟晚了几秒钟。 :)