我使用Ruby on Rails v4.1.0创建了一个新的应用程序.尝试在Windows上启动服务器或控制台时,我遇到以下错误:
$ rails server
Booting WEBrick
Rails 4.1.0 application starting in development on ....
Exiting
c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:199:
in `rescue in create_default_data_source':
No timezone data source could be found. To resolve this, either install
TZInfo::Data (e.g. by running `gem install tzinfo-data`) or specify a zoneinfo
directory using `TZInfo::DataSource.set(:zoneinfo, zoneinfo_path)`.
(TZInfo::DataSourceNotFound)
from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:196:
in `create_default_data_source'
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
如何设置刚刚从数据存储中发出的日期时间实例的时区?
当它第一次出现时它是UTC.我想把它改成EST.
我正在尝试,例如:
class Book( db.Model ):
creationTime = db.DateTimeProperty()
Run Code Online (Sandbox Code Playgroud)
检索Book时,我想立即设置其tzinfo:
book.creationTime.tzinfo = EST
Run Code Online (Sandbox Code Playgroud)
当我用这个例子我EST对象
但是我得到:
attribute 'tzinfo' of 'datetime.datetime' objects is not writable
我已经看到了一些推荐pytz和python-dateutil的答案,但我真的想要回答这个问题.
如何将作为TZInfo标识符接收的js值转换为Rails TimeZone名称/密钥?
FROM:"America/New_York"
从JavaScript TZinfo检测
TO 返回
:"Eastern Time (US & Canada)"
Rails TimeZone中使用的约定
或者另一个例子:
"Pacific/Honolulu"
=>转换为=>"Hawaii"
两者都可用于ActiveSupport::TimeZone < Object
映射,但rails "Eastern Time (US & Canada)"
在下拉列表,验证和存储中使用键[ig ] Time.use_zone()
.
根据我的理解,ActiveSupport::TimeZone.us_zones
这似乎是重要的,特别是DayLights节省时间(轨道声音处理得好)和只匹配偏移不会完成.如果没有使用rails TimeZone名称存储到DB,则验证将失败,并且在用户的配置文件设置页面中与下拉列表无法正确匹配ActiveSupport::TimeZone.zones_map
这样做的目的是用户不必在注册时选择他们的时区,或者在注册后需要在他们的设置中更改它们.浏览器检测到它并在注册时将其传递给hidden_field.在极少数情况下,他们在与家庭/工作不同的地方注册.他们可以稍后在其帐户设置中手动覆盖.
在尝试摄取js时区检测时似乎是一个常见的差距.这甚至可能成为如何将返回的信息从js传递给rails进行转换然后返回js以存储回表单的hidden_field的次要问题?希望我能正确地解决这个问题,并且确实有点使用rails的绿色,所以可能有一个简单的解决方案......
非常感谢所有的帮助!
-E
ActiveSupport Time.zone文档
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-parse
MAPPING = {"Eastern Time (US & Canada)" => "America/New_York"
Run Code Online (Sandbox Code Playgroud)
使用js打包gem'temporal-rails'来检测用户时区:https:
//github.com/jejacks0n/temporal
用户Time_Zone实现如下:http://railscasts.com/episodes/106-time-zones-revised
*使用设计和设计 - 不可避免
<script>
$(function() {
var detected_zone = Temporal.detect();
console.log(detected_zone); // returns object
detected_zone = detected_zone.timezone.name; …
Run Code Online (Sandbox Code Playgroud) 有没有办法从大多数Linux发行版上分发的时区数据库中提取历史性闰秒的时刻?我在python中寻找一个解决方案,但在命令行上运行的任何东西都可以.
我的用例是在gps-time(基本上是自1980年第一颗GPS卫星开启以来的秒数)和UTC或当地时间之间进行转换.UTC每隔一段时间调整一次闰秒,而gps-time会线性增加.这相当于在UTC和TAI之间进行转换.TAI也忽略了闰秒,所以TAI和gps-time应该始终以相同的偏移量进化.在工作中,我们使用gps-time作为同步全球天文观测的时间标准.
我有工作函数在gps-time和UTC之间转换,但我不得不硬编码闰秒表,我在这里(文件tzdata2013xx.tar.gz
包含一个名为的文件leapseconds
).每隔几年宣布新的leapsecond时,我必须手动更新此文件.我更希望从标准的tzdata中获取此信息,该信息每年通过系统更新自动更新几次.
我很确定这些信息隐藏在某些二进制文件中 /usr/share/zoneinfo/
.我已经能够使用struct.unpack
(man tzfile
提供有关格式的一些信息)来提取它,但我从来没有完全使用它.是否有可以访问此信息的标准软件包?我知道pytz,它似乎从同一个数据库中获取标准的DST信息,但它不能提供对闰秒的访问.我也找到了tai64n,但是看看它的源代码,它只包含一个硬编码表.
编辑
灵感来自steveha的答案和pytz/tzfile.py中的一些代码,我终于得到了一个有效的解决方案(在py2.5和py2.7上测试):
from struct import unpack, calcsize
from datetime import datetime
def print_leap(tzfile = '/usr/share/zoneinfo/right/UTC'):
with open(tzfile, 'rb') as f:
# read header
fmt = '>4s c 15x 6l'
(magic, format, ttisgmtcnt, ttisstdcnt,leapcnt, timecnt,
typecnt, charcnt) = unpack(fmt, f.read(calcsize(fmt)))
assert magic == 'TZif'.encode('US-ASCII'), 'Not a timezone file'
print 'Found %i leapseconds:' % leapcnt
# skip …
Run Code Online (Sandbox Code Playgroud) 我有一个表示日期的字符串文本,我完全能够解析它并将其转换为干净的日期时间对象:
date = "[24/Aug/2014:17:57:26"
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S")
Run Code Online (Sandbox Code Playgroud)
除非我无法使用此处指定的%z模式捕获带有时区的整个日期字符串
date_tz = 24/Aug/2014:17:57:26 +0200
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S %z]")
>>> ValueError: 'z' is a bad directive in format '[%d/%b/%Y:%H:%M:%S %z]'
Run Code Online (Sandbox Code Playgroud)
因为这个错误报告说
strftime()是按平台实现的
我确切地知道天真的tzinfo指令'%Z'没有这样的问题
通过使用dateutil模块将GST时间格式字符串转换为tzinfo对象[如此处建议] [4] ,然后将tzinfo插入datetime对象,我可以完美地做出以下解决方法
但是因为我显然需要%z模式用于进一步的项目,我想找到一个解决方案来避免这种解决方法并使用外部模块来完成这个简单的任务.你能给我一些阅读吗?我认为较新版本的python(我在2.7上)可以处理它但我现在不想改变我的版本这个小而重要的细节.
好吧,看到评论让我重新思考如何使用strptime()解析电子邮件时区指示器而不知道区域设置时间?
我有以下tzinfo
具体的子类定义:
from datetime import datetime, timedelta, tzinfo
class ManilaTime(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=8)
def tzname(self, dt):
return "Manila"
Run Code Online (Sandbox Code Playgroud)
我获取了一个日期字符串,并希望将其转换为时区感知datetime
对象.我更喜欢使用以下方法:
def transform_date(date_string, tzinfo):
fmt = '%Y-%m-%d'
# Where do I insert tzinfo?
date = datetime.strptime(date_string, fmt)
return date
Run Code Online (Sandbox Code Playgroud)
有什么方法可以通过以下方式插入tzinfo
到datetime
对象中?
manila = ManilaTime()
date = transform_date('2001-01-01', manila)
Run Code Online (Sandbox Code Playgroud) 有谁能帮我理解这里发生了什么?
import pytz
from datetime import datetime
tz = pytz.timezone('Europe/Berlin')
print repr(tz)
# <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
dt = datetime(2011, 1, 3, 18, 40)
result = tz.localize(dt)
print repr(result.tzinfo)
# <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>
assert result.tzinfo == tz, "Why aren't these the same timezone?"
Run Code Online (Sandbox Code Playgroud)
我的理解是localize()
pytz时区对象上的方法将采用一个天真的日期时间对象,并添加一个tzinfo
匹配执行本地化的时区对象的属性.在这种情况下似乎没有发生这种情况.
显然,我对时区或者pytz处理时区的方式有些误解.谁能解释一下?
好的,我们今天没有过好日子.
当您将正确的tzinfo对象附加到日期时间实例,然后strftime()它,它仍然以UTC格式出现,似乎忽略了我附加到它的漂亮的tzinfo对象.
# python 2.5.4 now = datetime.now() print now.strftime( "%a %b %d %X" ) # %X is "locale's appropriate time rep" pst = now.replace( tzinfo=Pacific ) print pst.strftime( "%a %b %d %X" )
我们得到:
Mon Jan 18 17:30:16 Mon Jan 18 17:30:16
我发现如果我添加%z,我可以添加它应该计算的差异:
Mon Jan 18 17:32:38 Mon Jan 18 17:32:38 -0800
它只是在那里加-8,好像在说,"你自己做,foo."
但是我希望strftime()能够简单地给我一个具有预定时间的字符串.
当我strftime()时,如何让strftime()为我做小时减法数学呢?
我正在使用的完整代码如下.
from datetime import tzinfo, timedelta, datetime
ZERO = timedelta(0)
HOUR = timedelta(hours=1)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt): …
Run Code Online (Sandbox Code Playgroud) 已经有一个问题可以解答如何将"America/Los_Angeles"转换为"太平洋时间(美国和加拿大)".但是我想将"US/Pacific"和其他过时的时区转换为Rails TimeZone.我无法在图书馆找到任何可以帮助我完成此任务的内容.
当我尝试从数据库中获取所有对象时,我在以下代码中收到此错误:
data1 = Data.objects.all()
for dataset in data1:
Run Code Online (Sandbox Code Playgroud)
这是我的模型:
class Data(models.Model):
id = models.AutoField(db_column='ID', primary_key=True) # Field name made lowercase.
path = models.TextField(db_column='Path') # Field name made lowercase.
username = models.ForeignKey('Users', models.DO_NOTHING, db_column='Username') # Field name made lowercase.
datatype = models.CharField(db_column='Datatype', max_length=20, blank=True, null=True) # Field name made lowercase.
filesize = models.FloatField(db_column='Filesize', blank=True, null=True) # Field name made lowercase.
creationdate = models.DateTimeField(db_column='CreationDate') # Field name made lowercase.
modificationdate = models.DateTimeField(db_column='ModificationDate') # Field name made lowercase.
diskname = models.CharField(db_column='Diskname', max_length=100, blank=True, …
Run Code Online (Sandbox Code Playgroud)