【问题标题】:Convert DateTime value to Final Fantasy XIV Eorzea Game Time [closed]将 DateTime 值转换为 Final Fantasy XIV Eorzea 游戏时间 [关闭]
【发布时间】:2015-03-12 16:55:59
【问题描述】:

我最近在网上找到了以下代码,它给出了 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 中那么容易(根据上面的代码)。

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

非常感谢所有帮助。

【问题讨论】:

  • 您需要在 WPF、winform oe Asp.Net 项目中执行此操作吗?
  • 这个问题似乎是题外话,因为它是关于代码翻译的。
  • 它需要在标准的 WindowsForm 应用程序中工作。关于偏离主题的评论,请问我还有其他地方可以发布这个问题吗?再次感谢所有帮助。
  • 您应该尝试自己转换代码,然后返回实现中的特定问题。
  • @user3310909 你的问题有点含糊。您能否对其进行更新以澄清:您是在问如何在 C# 中计算 Eorzea 时间吗?或者如何在 WinForms 应用程序中显示实时时钟?我不会认为其中任何一个都是题外话,但它出现在您要求直接代码翻译的那一刻。

标签: javascript c# date time


【解决方案1】:

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

Javascript 的 Time 类基于 Epoch Time(自 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 时钟设置准确......我发现这段代码在几分钟后才发现我的时钟落后了几秒钟。 :)

【讨论】:

  • 再次问候,我回顾了我的代码,实际上我试图准确地翻译 JS 脚本正在做什么而忘记了只遵循逻辑。非常感谢您提供的信息,我还需要学习在 C# 中使用时间和计时器,它帮助很大。再次抱歉,起初没有那么清楚,但我的问题确实得到了回答,谢谢。我会在我的工具上做一个信用部分,我会确保把你的名字放进去。
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2014-05-25
  • 2012-04-04
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多