在时区之间进行转换时,C#是否会考虑夏令时?
我有一个源日期在伦敦的当前时间,我想将其转换为我的时区(CET).这是我正在使用的代码.
DateTime time = DateTime.ParseExact(timeString, "HH:mm", null);
time = DateTime.SpecifyKind(time, DateTimeKind.Unspecified);
//Convert it to the right timezone. It is currently in GMT
TimeZoneInfo gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
TimeZoneInfo current = TimeZoneInfo.Local;
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(time, gmt);
DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utc, core.startTime = local;
Run Code Online (Sandbox Code Playgroud)
它目前运作良好.然而,当DST出现丑陋的头脑时,它会继续工作还是会破坏它?由于过去遇到过很多问题,我对TimeZones有点警惕.
我正在执行下面的代码.
int main()
{
struct tm storage={0,0,0,0,0,0,0,0,0};
char *p = NULL;
p = (char *)strptime("2012-08-25 12:23:12","%Y-%m-%d %H:%M:%S",&storage);
char buff[1024]={0};
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
storage.tm_sec += 20;
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
mktime(&storage);
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果以上程序执行,则打印'2012-08-25 13:23:32'而不是'2012-08-25 12:23:32'.请帮助,为什么它增加了tm_hour值.如果我在程序中输入日期为"2012-02-25 12:23:32",这可以正常工作,这很令人困惑.
输出 - >
[user@rtpkvm55-vm2 root]$ ./a.out
2012-08-25 12:23:12
2012-08-25 12:23:32
2012-08-25 13:23:32
[user@rtpkvm55-vm2 root]$
Run Code Online (Sandbox Code Playgroud)
我系统上的日期信息, - >
[user@rtpkvm55-vm2 root]$ date
Sat Aug 25 08:28:26 EDT 2012
Run Code Online (Sandbox Code Playgroud) 我有一个代码如下:
from django.utils.timezone import get_current_timezone, make_aware
make_aware(some_datetime, get_current_timezone())
Run Code Online (Sandbox Code Playgroud)
该make_aware呼叫偶尔引发
AmbiguousTimeError: 2013-11-03 01:23:17
Run Code Online (Sandbox Code Playgroud)
我从Django文档中了解到这是一个夏令时问题,而且这个时间戳实际上是模棱两可的.现在我该如何解决它(比如这可能是两个可能的第一个)?
"在"能源危机"时期,国会通过了白昼时间的早期开始日期.1974年,白昼时间从1月6日开始,1975年开始于2月23日.在这两年后,开始日期又回到了上周日. 4月."
(通过http://aa.usno.navy.mil/faq/docs/daylight_time.php)
这些日期的Javascript日期对象中似乎存在错误.如果你将127627200000毫秒转换为日期,它应该是美国东部时间1974年1月17日00:00:00.这在http://www.fileformat.info/tip/java/date2millis.htm上是正确的,但在 http: //www.esqsoft.com/javascript_examples/date-to-epoch.htm,表示它将转换为1974年1月16日星期三19:00 23:00:00 GMT-0500(东部标准时间).如果您在javascript中创建一个新的日期(127627200000)对象,它将提供后一个日期转换.这种情况发生在所有主流浏览器
我无法想象这是第一次这对任何人来说都是一个问题,但我在网上搜索时找不到任何其他问题.有没有人知道是否有一个现有的修复程序或更容易修复,而不是手动检查日期Javascript的转换错误?还有其他日期这是一个问题吗?
我正在编写一个程序,它可以处理很多时区并将它们交叉.我最常处理的两件事是从"now"创建一个datetime对象,然后本地化一个天真的datetime对象.
要在太平洋时区创建一个日期时间对象,我目前正在这样做(python 2.7.2+)
from datetime import datetime
import pytz
la = pytz.timezone("America/Los_Angeles")
now = datetime.now(la)
Run Code Online (Sandbox Code Playgroud)
对于夏令时,这是正确的吗?如果没有,我想我应该这样做:
now2 = la.localize(datetime.now())
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么?任何人都可以告诉我第一个错误的情况,秒是对的?
至于我的秒问题,假设我在加利福尼亚州洛杉矶上午8:00的某个用户输入中有一个天真的日期和时间.是这样制作日期时间的正确方法:
la.localize(datetime(2012, 9, 1, 8, 0))
Run Code Online (Sandbox Code Playgroud)
如果没有,我应该如何构建这些日期时间?
我想用R进行时间序列分析.我想制作一个时间序列模型,并使用包timeDate和预测中的函数.
我在CET时区有日内数据(15分钟数据,每小时4个数据点).在3月31日实施了夏令时,我错过了我通常拥有的96个数据点.10月28日,随着时间的推移,我有4个数据点太多了.
对于我的时间序列模型,我总是需要96个数据点,否则日内季节性会变得混乱.
你有这方面的经验吗?你知道一个R函数或一个有助于自动化这种数据处理的包 - 一些优雅吗?谢谢!
我有一个需要时区的API.例如.如果我在加利福尼亚州,我需要在夏令时(加利福尼亚州,PDT是格林尼治标准时间 - 7)和-8时,在夏令时关闭时将-7传递给它.但我无法弄清楚是否在当前日期,夏令时开启或关闭.
Date date1 = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date1);
double[] coords = db.getCoords(id1);
double latitude = coords[0];
double longitude = coords[1];
double timezone = -7; /* For Pacific daylight time (GMT - 7)*/
ArrayList<String> Times = Class.foo(cal, latitude,
longitude, timezone);
Run Code Online (Sandbox Code Playgroud)
我已经安装了JodaTime,即使在那里我也找不到办法.请建议如果本机java或jodatime,要么有办法这样做.
我需要在MySQL(InnoDB)DB中将一些TIMESTAMP字段转换为INT.我意识到将TIMESTAMP转换为INT是不寻常的,但我们仍然需要这样做:)
看起来很简单,但有一些时区和夏令时错误.
我有一个脚本,每列生成我的SQL代码.例如,它生成:
ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED;
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started);
ALTER TABLE alarmLog DROP started;
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)
如果我比较使用前后数据select FROM_UNIXTIME(1291788036);,结果看起来不错.
然后,我们的想法是将所有客户端软件更改为转换为UTC,并在存储时使用该INT.检索时,该INT将转换为当前时区.
但后来文档警告我这个场景(CET中的夏令时):
mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2005-03-27 02:00:00') |
+---------------------------------------+
| 1111885200 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2005-03-27 03:00:00') |
+---------------------------------------+
| 1111885200 |
+---------------------------------------+
1 row in set (0.00 …Run Code Online (Sandbox Code Playgroud) 我需要在给定的时间每天设置一个闹钟.我正在使用编程警报AlarmManager.RTC_WAKEUP,因此它使用系统时间作为参考.我将警报设置为首先在所需的小时执行,然后每天重复:
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
getTimestampToday("12:00"),
AlarmManager.INTERVAL_DAY,
pendingIntent
);
Run Code Online (Sandbox Code Playgroud)
该getTimestampToday方法在所需的小时返回今天的长时间戳.它通过获取今天的本地日期,然后设置所需的小时,最后将其转换回时间戳(基于UTC)来实现.
这里的问题是警报应该根据当地时间工作.因此,如果在安排警报后更改时间(例如,DST时间更改,或者用户前往其他国家/地区,或者他手动更改日期,时间或时区),则警报将在错误的当地时间触发下次.
例:
该应用程序应该运行很长一段时间(它是一个仅供企业使用的自助服务终端应用程序).我在应用程序启动时重新安排警报,但这并不能解决我的问题,因为应用程序可以运行数天而无需重新启动.我需要检测时间的变化,以便根据新的本地时间再次安排警报.
我正在使用这个接收器:
<receiver android:name="foo.bar.receivers.TimeChangeReceiver" >
<intent-filter>
<action android:name="android.intent.action.ACTION_TIMEZONE_CHANGED" />
<action android:name="android.intent.action.ACTION_TIME_CHANGED" />
<action android:name="android.intent.action.DATE_CHANGED"></action>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
它会检测日期更改,但不适用于时间更改或时区更改.(在运行OS 4.0.3的平板电脑上测试过).这真的很奇怪,因为我可以清楚地看到在logcat中广播的事件.
所以我的问题:
ACTION_TIMEZONE_CHANGED和ACTION_TIME_CHANGED事件,我怎么能解决它.提前致谢.
我的时代,他们正在改变,也就是说,因为我需要他们.我正在测试一些涉及我使用的调度程序的情况,这涉及到夏令时之间转换的行为.
从这篇文章我得到了一个工作方法,使我能够以编程方式更改系统日期(重新发布大部分代码):
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetSystemTime(ref SYSTEMTIME st);
Run Code Online (Sandbox Code Playgroud)
为了我自己的方便,我只是在我实际调用的函数中包装它:
public static void SetSytemDateTime(DateTime timeToSet)
{
DateTime uniTime = timeToSet.ToUniversalTime();
SYSTEMTIME setTime = new SYSTEMTIME()
{
wYear = (short)uniTime.Year,
wMonth = (short)uniTime.Month,
wDay = (short)uniTime.Day,
wHour = (short)uniTime.Hour,
wMinute = (short)uniTime.Minute, …Run Code Online (Sandbox Code Playgroud)