我需要将从服务器获得的UTC时间戳转换为本地设备时间.目前我的时间差5小时.例如,当我发布到服务器的帖子时间说5小时前而不是一秒钟前.如何解决这个问题.谢谢
以下是我的代码
long timestamp = cursor.getLong(columnIndex);
CharSequence relTime = DateUtils
.getRelativeTimeSpanString(timestamp * 1000
+ TimeZone.getDefault().getRawOffset(),
System.currentTimeMillis(),
DateUtils.MINUTE_IN_MILLIS);
((TextView) view).setText(relTime);
Run Code Online (Sandbox Code Playgroud) 将天真时间tzinfo转换为UTC时间的正确方法是什么?说我有:
d = datetime(2009, 8, 31, 22, 30, 30)
tz = timezone('US/Pacific')
Run Code Online (Sandbox Code Playgroud)
第一种方式,pytz启发:
d_tz = tz.normalize(tz.localize(d))
utc = pytz.timezone('UTC')
d_utc = d_tz.astimezone(utc)
Run Code Online (Sandbox Code Playgroud)
第二种方式,来自UTCDateTimeField
def utc_from_localtime(dt, tz):
dt = dt.replace(tzinfo=tz)
_dt = tz.normalize(dt)
if dt.tzinfo != _dt.tzinfo:
# Houston, we have a problem...
# find out which one has a dst offset
if _dt.tzinfo.dst(_dt):
_dt -= _dt.tzinfo.dst(_dt)
else:
_dt += dt.tzinfo.dst(dt)
return _dt.astimezone(pytz.utc)
Run Code Online (Sandbox Code Playgroud)
不用说,这两种方法在很多时区产生不同的结果.
问题是 - 什么是正确的方法?
我发现很难理解UTC是如何工作的.
我必须做以下事情,但如果我得到了正确的结果,我仍然感到困惑.
目标:
所以代码是:
public ConvertDate(DateTime? dateTime)
{
if (dateTime != null)
{
Value = (DateTime)dateTime;
TimeZone = GetFromConfig.DefaultTimeZone();
}
}
public ConvertDate(DateTime? dateTime, int GMTTimeZone)
{
if (dateTime != null)
{
Value = (DateTime)dateTime;
TimeZone = GMTTimeZone;
}
}
public int TimeZone
{
get { return m_TimeZone; }
set { m_TimeZone = value; }
}
DateTime m_Value;
public DateTime Value
{
get { return m_Value; }
set
{
m_Value = value;
DateTime converted = m_Value.ToUniversalTime().ToLocalTime();
} …Run Code Online (Sandbox Code Playgroud) 有没有简单的方法来得到一个数字,因为经过的毫秒1 January 1970 00:00:00 UTCsimular的Date.now()JavaScript函数?
我有一个datetimeutc时区,例如:
utc_time = datetime.datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
还有一个pytz时区对象:
tz = timezone('America/St_Johns')
Run Code Online (Sandbox Code Playgroud)
转换utc_time到给定时区的正确方法是什么?
关于在DB中保存日期时间和时区信息有很多问题,但总体水平更多.在这里,我想谈谈一个具体的案例.
系统规格
DB中需要涵盖业务规则
ORDR-13432-Year-Month-Day).精确计算目前并不重要,重要的是它取决于租户的本地日期时间我们最初的想法
方法1
保存当地租户的日期时间对每个租户来说都不错,但是我们遇到的问题包括:
SELECT * FROM ORDERS WHERE OrderDateTime BETWEEN UTCDateTime1 AND UTCDateTime2
Run Code Online (Sandbox Code Playgroud)这是有问题的,因为OrderDateTime在这个查询中意味着基于租户的不同时刻.当然,此查询可能包括连接到Tenants表以获取本地日期时间偏移量,然后将在运行中进行计算OrderDateTime以进行调整.这是可能的,但不确定这是否是一个好方法呢?
方法2
让我们举一个极端的例子; 让我们说租户比UTC早6个小时,他的当地日期时间是2017-01-01 02:00.UTC会是2016-12-31 20:00.此时下达的订单应该获得OrderNumber 'ORDR-13432-2017-1-1'但是如果保存UTC则会得到ORDR-13432-2016-12-31.
在这种情况下,在DB中创建Order时,我们应该根据重新计算的租户本地时间获得UTC日期时间,租户偏移和编译OrderNumber,但仍然以UTC格式保存DateTime列.
问题
[UPDATE]
根据Gerard Ashton和Hugo的评论:
如果租户可以改变时区,那么最初的问题就细节而言并不明确,如果政治当局改变时区属性或某个时区的时区会发生什么.当然,这是非常重要的,但它不是这个问题的核心.我们可以在另一个问题中解决这个问题.
为了这个问题,让我们假设租户不会改变位置.该位置的时区属性或时区本身可能会发生变化,这些更改将在系统中与此问题分开处理.
随着今年闰秒在地平线上月它让我知道.net框架是否是闰秒知道?额外的第二个将在6月30日的最后一秒之后插入,因此UTC将正式:
2012 June 30, 23h 59m 59s
2012 June 30, 23h 59m 60s
2012 July 1, 0h 0m 0s
Run Code Online (Sandbox Code Playgroud)
.Net框架能够处理这个吗?如果Windows不是Leap Second意识到,这甚至是否重要?这会影响运行在O/S上的单声道应用程序是否具有 Leap Second感知功能?
编辑:
为了进一步扩展这一点,我想象一个场景,Linux上的基于Java的解决方案(Leap Second感知)调用.Net Web服务传递的内容是Java中的有效时间戳但是超出范围.净.有没有适合它的框架(也许像Noda Time一样)?
为了显示可重现的场景,我正在做以下事情
获取当前系统时间(当地时间)
将本地时间转换为UTC //在这里工作正常
反转UTC时间,返回当地时间.遵循3种不同的方法(如下所列),但所有3种方法仅保留UTC时间.
{
long ts = System.currentTimeMillis();
Date localTime = new Date(ts);
String format = "yyyy/MM/dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat (format);
// Convert Local Time to UTC (Works Fine)
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date gmtTime = new Date(sdf.format(localTime));
System.out.println("Local:" + localTime.toString() + "," + localTime.getTime() + " --> UTC time:" + gmtTime.toString() + "-" + gmtTime.getTime());
// Reverse Convert UTC Time to Locale time (Doesn't work) Approach 1
sdf.setTimeZone(TimeZone.getDefault());
localTime = new Date(sdf.format(gmtTime));
System.out.println("Local:" + localTime.toString() + "," …Run Code Online (Sandbox Code Playgroud)java utc simpledateformat date-formatting timestamp-with-timezone
我有一个倒计时时钟,设定为2014年1月1日上午8点倒计时.
我使用以下代码来设置日期:
var futureDate = new Date(2014, 0, 1, 8, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
这有效,但我想更进一步,并将其设置为特定的时区.在我的情况下UTC -7.
我已经阅读了这个使用说明的答案:
new Date(Date.UTC(year, month, day, hour, minute, second))
Run Code Online (Sandbox Code Playgroud)
但我感到困惑的是我如何将时区设置为UTC -7,而我在线阅读的内容只会让我更加困惑.
有人可以解释如何Date.UTC工作以及如何设置时区,以便我的倒计时时钟根据指定的时区倒计时?
注意:任何答案必须是仅客户端代码.
该java.util.Date toString()方法显示本地时区的日期.
有几种常见的情况我们希望以UTC格式打印数据,包括日志,数据导出和与外部程序的通信.
java.util.Date在UTC中创建字符串表示形式的最佳方法是什么?toString()格式替换juDate的格式,这是不可排序的(谢谢@JonSkeet!)?我认为以自定义格式和时区打印日期的标准方法非常繁琐:
final Date date = new Date();
final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";
final SimpleDateFormat sdf = new SimpleDateFormat(ISO_FORMAT);
final TimeZone utc = TimeZone.getTimeZone("UTC");
sdf.setTimeZone(utc);
System.out.println(sdf.format(date));
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个单线像:
System.out.println(prettyPrint(date, "yyyy-MM-dd'T'HH:mm:ss.SSS zzz", "UTC"));
Run Code Online (Sandbox Code Playgroud)