我有一个asp.net-mvc网站,我接手了一个页面页面,人们输入信息和时间(包括当地时区).数据库持续开始时间,结束时间和时区,因为它对我来说有点不稳定.这是获取列表的代码:
static private IEnumerable<SelectListItem> GetTimeZones(string selected)
{
var timeZoneNames = TimeZoneInfo.GetSystemTimeZones()
.Where(tz => tz.DisplayName.Contains("London")
|| tz.DisplayName.Contains("Hong Kong")
|| tz.DisplayName.Contains("Mumbai")
|| tz.DisplayName.Contains("Eastern Time"))
.ConvertAll(tz => tz.DisplayName).ToList();
var items = new List<SelectListItem>();
foreach (var item in timeZoneNames)
{
var slItem = new SelectListItem();
slItem.Text = item;
slItem.Value = item;
slItem.Selected = item == selected;
items.Add(slItem);
}
return items;
}
Run Code Online (Sandbox Code Playgroud)
所以它只是存储从TimeZoneInfo.GetSystemTimeZones()返回的完整字符串
这种方法有什么缺陷吗?我有点担心在这里读到这是来自机器本地,如果不同的机器有不同的设置.此外,试图弄清楚是否所有内容都列为UTC或GMT等..有更好的建议吗?例如,我应该在网站上转换为UTC并规范化数据库中的所有时间吗?
好吧,首先让我说我的时区是CET/CEST.它从CEST变为CET的确切时刻(从DST返回,即GMT + 2,再到正常,GMT + 1,因此)始终是10月的最后一个星期日凌晨3点.2010年10月31日凌晨3点.
现在请注意以下事项:
>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)
Run Code Online (Sandbox Code Playgroud)
如上所述,这是错误的.
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)
Run Code Online (Sandbox Code Playgroud)
现在它突然变得正确:/
我知道有几个问题已经存在,但给出的解决方案始终是"使用本地化",但我的问题是LocalTimezone不提供该方法.
事实上,我有几个时间戳,以毫秒为单位,我需要本地时区的utcoffset(不仅是我的,而是使用该程序的任何人).其中一个是1288483950000或Sun Oct 31 2010 02:12:30 GMT + 0200(CEST)在我的时区.
目前我执行以下操作来获取datetime对象:
datetime.datetime.fromtimestamp(int(int(millis)/1E3))
Run Code Online (Sandbox Code Playgroud)
这将在几分钟内得到utcoffset:
-int(local_tnz.utcoffset(date).total_seconds()/60)
Run Code Online (Sandbox Code Playgroud)
不幸的是,在很多场合都是错的:(.
有任何想法吗?
注意:我正在使用python3.2.4,而不是在这种情况下它应该是重要的.
编辑:
通过@JamesHolderness找到解决方案:
def datetimeFromMillis(millis):
return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))
def getTimezoneOffset(date):
return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)
Run Code Online (Sandbox Code Playgroud)
local_tz等于tzlocal模块中的tzlocal.get_localzone().
不,我不是在谈论区域偏移 - 这些区域在一年中可能因基于例如夏令时的区域而变化.我在谈论IANA维护的实际时区.我理解ISO 8601 不支持这些,对吗?
什么平台在支持ISO 8601类似字符串表示中识别时区?我注意到最新的Java日期/时间库正在使用扩展的ISO 8601格式,例如2011-12-03T10:15:30+01:00[Europe/Paris].(请参阅DateTimeFormatter API.)
是否有一些融合约定(例如与其他语言和平台一起)用于扩展ISO 8601以支持时区指定?
我在使用 . 测试一些时区时发现了一个奇怪的 java 差异ZonedDateTime。我试图解析 1970 年之前的日期,发现结果在 java 版本之间发生变化。1932 年荷兰的偏移量是+00:19。有谁知道为什么会发生这种情况?我觉得这可能与时区数据库项目( https://github.com/eggert/tz )中欧洲时区的捆绑有关,但我不确定。有没有办法获得java中的旧行为?就像设置一样?
ZonedDateTime zdt = LocalDateTime.parse("1932-10-20T10:19:32.000").atZone(ZoneId.of("Europe/Amsterdam"));
System.out.println(zdt);
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(ISO_LOCAL_DATE)
.appendLiteral('T')
.appendValue(HOUR_OF_DAY, 2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR, 2)
.optionalStart()
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE, 2)
.optionalStart()
.appendFraction(NANO_OF_SECOND, 3, 3, true)
.appendOffset("+HH:MM", "Z")
.toFormatter();
System.out.println(formatter.format(zdt));
System.out.println(
java.time.zone.ZoneRulesProvider
.getVersions("UTC")
.lastEntry()
.getKey()
);
Run Code Online (Sandbox Code Playgroud)
结果 Temurin (java jdk) 11.0.16 (预期输出),最后一行显示时区数据库版本:
1932-10-20T10:19:32+00:19:32[Europe/Amsterdam]
1932-10-20T10:19:32.000+00:19
2022a
Run Code Online (Sandbox Code Playgroud)
Temurin 11.0.17 的结果:
1932-10-20T10:19:32Z[Europe/Amsterdam]
1932-10-20T10:19:32.000Z
2022c
Run Code Online (Sandbox Code Playgroud)
编辑:从 17.0.5 开始,JDK 17 中也存在一个问题:
铁木林 17.0.4:
1932-10-20T10:19:32+00:19:32[Europe/Amsterdam]
1932-10-20T10:19:32.000+00:19
2022a
Run Code Online (Sandbox Code Playgroud)
铁木林 …
我希望显示相对于用户时区的日期.
我希望Angular有办法全局配置Date过滤器来执行此操作 - 必须根据具体情况手动执行此操作感觉不对.
我的时间戳已经被包裹在一个timestamp()功能(只需1000繁殖),但我不希望修改功能,如果我不具备对.
编辑:
我正在做这个,它有效,但如上所述,如果可能的话,我想把它设置得更高一级
$scope.timestamp = function (unix_time) {
var epoch = (unix_time * 1000);
var date = new Date();
var localOffset = (-1) * date.getTimezoneOffset() * 60000;
var stamp = Math.round(new Date(epoch + localOffset).getTime());
return stamp;
};
Run Code Online (Sandbox Code Playgroud) 如何将UTC时间转换为当地时间?我为当地时间所需的所有国家创建了一张UTC差异地图.然后我将该差异作为持续时间添加到当前时间(UTC)并打印结果,希望这是该特定国家/地区的当地时间.由于某些原因,结果是错误的.例如在匈牙利,有一个小时的差异.知道为什么我的结果不正确吗?
package main
import "fmt"
import "time"
func main() {
m := make(map[string]string)
m["Hungary"] = "+01.00h"
offSet, err := time.ParseDuration(m["Hungary"])
if err != nil {
panic(err)
}
t := time.Now().UTC().Add(offSet)
nice := t.Format("15:04")
fmt.Println(nice)
}
Run Code Online (Sandbox Code Playgroud) 我目前正在努力确保我们的传统后端可以根据用户的当前时区(或更具体地说是偏移量)支持解析日期时间.我们的服务器处于东部标准时间,我们的大部分日期时间都来自那里.但是,对于位于其他时区的用户,在检索这些日期时间时需要转换到其时区(或者,在这种情况下为偏移).此外,来自用户的日期时间必须在服务器上持久化之前转换为东部标准时间.鉴于我们正在开发的前端是基于Web的,我能够在几分钟内检索用户的偏移量,并将该值传递到标题内的服务层.我看了Noda Time并认为它是一个很棒的API.它确实迫使我在更精致的事情中思考时间,但我仍然不能100%确定我已正确使用它.以下是我为上述转换编写的方法.我测试了它们,它们似乎有效.鉴于上述情况,这看起来是否正确使用了库?我是否正确考虑约会时间?
public static DateTime ConvertToUtcFromEasternTimeZone(DateTime easternDateTime)
{
NodaTime.DateTimeZone easternTimeZone = NodaTime.DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/New_York");
ZoneLocalMappingResolver customResolver = Resolvers.CreateMappingResolver(Resolvers.ReturnLater, Resolvers.ReturnStartOfIntervalAfter);
var easternLocalDateTime = LocalDateTime.FromDateTime(easternDateTime);
var easternZonedDateTime = easternTimeZone.ResolveLocal(easternLocalDateTime, customResolver);
return easternZonedDateTime.ToDateTimeUtc();
}
public static DateTime ConvertToEasternTimeZoneFromUtc(DateTime utcDateTime)
{
NodaTime.DateTimeZone easternTimeZone = NodaTime.DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/New_York");
NodaTime.DateTimeZone utcTimeZone = NodaTime.DateTimeZoneProviders.Tzdb.GetZoneOrNull("UTC");
ZoneLocalMappingResolver customResolver = Resolvers.CreateMappingResolver(Resolvers.ReturnLater, Resolvers.ReturnStartOfIntervalAfter);
var utcLocal = LocalDateTime.FromDateTime(utcDateTime);
var utcZonedDateTime = utcTimeZone.ResolveLocal(utcLocal, customResolver);
var easternZonedDateTime = utcZonedDateTime.ToInstant().InZone(easternTimeZone);
return easternZonedDateTime.ToDateTimeUnspecified();
}
public static DateTime ConvertToUtc(DateTime dateTime, int offsetInMinutes)
{
LocalDateTime localDateTime = LocalDateTime.FromDateTime(dateTime);
var convertedDateTime = localDateTime.PlusMinutes(offsetInMinutes).ToDateTimeUnspecified(); …Run Code Online (Sandbox Code Playgroud) 以下查询
SELECT the_date FROM date_trunc('day', timestamp with time zone
'2001-01-1 00:00:00+0100') as the_date
Run Code Online (Sandbox Code Playgroud)
结果
the_date
2000-12-31 00:00
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉date_trunc根据它所用的时区进行日/月/年转换?
预期的产出是: 2001-01-1 00:00+0100
我有一个奇怪的问题,Date当它通过$ http.put传递给API时发生了变化,我怀疑是时区问题:
Datepicker触发ng-change事件 - console.log:
Tue Jun 10 2014 00:00:00 GMT+0100 (GMT Summer Time)
使用Angular $ http.put传递给API ...
当它击中提琴手时:
StartDate=2014-06-09T23:00:00.000Z
如您所见,日期从6月10日到6月9日.
我怎样才能阻止这种更改日期?这是导致变化的时区吗?API和客户端都在Localhost上运行.
除此之外:
当第二次单击该字段并选择了datepicker启动/日期时,第二次出现问题:
CONSOLE.LOG:
Wed Aug 06 2014 22:00:00 GMT+0100 (GMT Summer Time)
收到的提琴手数据:
StartDate=2014-08-06T21:00:00.000Z
javascript date-format timezone-offset angularjs angular-ui-bootstrap
对你来说很划清楚.
我从IPInfoDB的API中获取地理IP数据,它返回UTC的时区偏移,包括 DST(如果当前反映).
例如,我住在EST(-5),目前它是DST,所以geo IP API返回(-04:00)作为偏移量.
这很好,因为DST是一个令人头疼的问题.但令我惊讶的是,它引起了另一次头痛.
我在PHP中加载这些数据,通过AJAX传递给应用程序.我想在应用程序上获得IP地址的实时本地时间.
我有完美的设置,但我疯狂试图找出如何设置PHP时区以匹配偏移量,所以我可以抓住当前的小时date('H');和分钟date('i');通过AJAX传递.
我不确定是否有一个特定的功能可以根据该偏移给我当前的小时和分钟,或者是否有一种实用的方法来根据偏移设置时区(如果有效,将会应用DST) .
我一直在搜索和搜索谷歌以找到答案,但我正在做的更具体,因为已经应用了夏令时.
我在PHP.net上找到了一个似乎可以解决问题的功能(它适用于我的时区并返回正确的时间),但对于其他时区如PST,它比它应该返回1小时后即使偏移是正确的(-07:00与DST).
从函数返回的时区是Chile/EasterIsland我感觉到的原因.如果可以的话,我会让这只适用于美国,但我确实需要它在全球范围内.
这是我现在的功能.请原谅极其凌乱的代码.在过去的几个小时里,我一直在玩弄很多东西试图找出解决方案.
大部分功能都是在线发现的.
function offsetToTZ($offset) {
switch((string) $offset) {
case '-04:30' : return 'America/Caracas'; break;
case '-03:30' : return 'Canada/Newfoundland'; break;
case '+03:30' : return 'Asia/Tehran'; break;
case '+04:30' : return 'Asia/Kabul'; break;
case '+05:30' : return 'Asia/Kolkata'; break;
case '+05:45' : return 'Asia/Kathmandu'; break;
case '+09:30' : return 'Australia/Darwin'; break;
} …Run Code Online (Sandbox Code Playgroud) timezone-offset ×10
timezone ×7
angularjs ×2
c# ×2
java ×2
javascript ×2
date ×1
date-format ×1
datetime ×1
geolocation ×1
go ×1
iso8601 ×1
java-11 ×1
nodatime ×1
php ×1
postgresql ×1
python ×1
pytz ×1
sql-server ×1
time ×1
tzdata ×1