可能最简单的方法是通过 COM Interop 来使用DateTime
.NET 内置的 API。对于这种方法有一个很好的介绍在这个答案中 https://stackoverflow.com/a/19955042/634824.
创建 C# 类库。为了让事情变得更简单,请以 .NET Framework 4.6 或更高版本为目标,这样您就可以使用FromUnixTimeSeconds
and ToUnixTimeSeconds
上的方法DateTimeOffset
class.
using System;
using System.Runtime.InteropServices;
namespace MyDateTimeLibrary
{
[Serializable]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class DateTimeFunctions
{
public DateTime UnixTimeToDateTime(int unixTimeInSeconds)
{
return DateTimeOffset.FromUnixTimeSeconds(unixTimeInSeconds).UtcDateTime;
}
public long DateTimeUtcToUnixTime(DateTime utcDateTime)
{
return new DateTimeOffset(utcDateTime, TimeSpan.Zero).ToUnixTimeSeconds();
}
public DateTime UtcToLocal(DateTime utcDateTime)
{
return utcDateTime.ToLocalTime();
}
public DateTime LocalToUtc(DateTime localDateTime)
{
return localDateTime.ToUniversalTime();
}
public DateTime TZSpecificDateTimeToUTC(DateTime sourceDateTime, string sourceTimeZoneId)
{
var tzi = TimeZoneInfo.FindSystemTimeZoneById(sourceTimeZoneId);
return TimeZoneInfo.ConvertTimeToUtc(sourceDateTime, tzi);
}
public DateTime UTCToTZSpecificDateTime(DateTime utcDateTime, string destinationTimeZoneId)
{
var tzi = TimeZoneInfo.FindSystemTimeZoneById(destinationTimeZoneId);
return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tzi);
}
}
}
对于你所要求的,你真的只需要UnixTimeToDateTime
and UtcToLocal
上面代码中的方法,但我想我应该为其他可能处于类似情况的人提供更多的方法。实际上,您可以在 .NET 中执行的任何操作都可以在这里执行。互联网DateTime
, DateTimeOffset
and TimeZoneInfo
API 比完成类似工作所需的 Win32 API 更简单、更可靠。
检查Register for COM interop
构建之前的选项(如前面链接的答案中所述),或者通过 COM 注册您的 DLLRegAsm.exe
如果您要部署到另一台计算机,则可以使用该实用程序。
接下来,将 VBA 项目中的引用添加到新注册的项目中MyDateTimeLibrary
。然后使用它,就像这样(例如):
Sub Test()
Dim dtf As New MyDateTimeLibrary.DateTimeFunctions
Dim utcDt As Date, localDt As Date
utcDt = dtf.UnixTimeToDateTime(1487010504)
localDt = dtf.UtcToLocal(utcDt)
MsgBox ("UTC: " + CStr(utcDt) + vbCrLf + "Local: " + CStr(localDt))
Set dtf = Nothing
End Sub
我相信您可以重构它来编写一些有用的 VBA 函数,这些函数可以传入和传出要转换的日期、从 Excel 单元格或任何您的上下文中调用这些函数。我会把这部分留给你。