将DateTime值转换为最终幻想XIV Eorzea游戏时间

时间:2015-01-14 13:28:15

标签: javascript c# date 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中那么容易(根据上面的代码)。

有人可以帮我转换代码吗?

非常感谢所有帮助。

1 个答案:

答案 0 :(得分:2)

假设您的问题是“我如何计算C#中的Eorzea时间”:

Javascript的时间等级基于大纪元时间(自1970年1月1日00:00起经过的时间量)。当您将Time()对象相乘时,您将乘以自该日期起经过的秒数。

.NET的DateTime类不支持简单的乘法运算符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时钟设置准确...我发现这段代码只有几分钟,直到我意识到我的时钟落后了几秒钟。 :)