标签: iso8601

时间戳:iso8601 vs unix时间戳

我知道这是一个非常常见的问题,但我觉得我找到的答案并没有真正解决问题.我将概述我的具体用例,并向其他SO答案和网络上的信息提供摘要.

对于我正在编写的服务,数据库条目是在移动设备和我们的网站上创建和存储的,需要同时进行同步.我们目前的目标是Android和iOS,它们都使用sqlite作为关系数据库.服务器端使用Django和MySQL在Python中实现,但其他解决方案可能在将来取代它.

将按照此SO答案中概述的想法实施同步:https://stackoverflow.com/a/5052208/2076094.对于同步,我们将使用仅由服务器设置并同步到客户端的时间戳,用于创建和更新对象的last_synced_date和时间戳.由于对象引用用户在某些时间所做的事情,因此它们也具有时间戳信息.

我的问题只涉及用于这些时间戳的内部时间表示.UI中的用户表示是内部表示的本地化和格式化版本.在实现语言和用于表示时间戳的不同数据库中有许多不同的方式.经过相当多的研究后,似乎只剩下有效的解决方案了:

  • Unix的时间
  • ISO8601

文章这是Hacker News上(两次),建议使用UNIX时间,并提出一个相当不错的参数.正如所预料的那样,关于HN的讨论在上述两点以及一些点之间存在很大差异.

到目前为止,我的结论是,Unix时间戳更容易处理,但似乎不是Django的常用方法.几乎我发现的每个代码示例,从Django教程到很多其他站点,都在models.py中使用DateTimeField,它被映射到SQL中的某种日期字段,具体的术语取决于所使用的数据库.

使用ISO8601日期进行传输和存储的缺点是需要解析它们以创建相应的实现语言的日期类型.这并不难,但有点烦人.对于我们使用的每种语言,您需要一个(小)库或者至少需要比您希望的更多的代码.它不是很漂亮,创建依赖关系,可能会稍微慢一些.在我知道的任何语言中,Unix时间时间戳都没有这个问题.

另一件事是,您可以轻松地使用数据库中的"智能"日期或时间戳字段(以及解析期间).关于时间魔法的问题有很多问题可以解决问题.达到我的链接限制,所以我不能发布任何内容,但你很容易找到一些;)

我们可以使用不包含时区信息的简化格式,只使用UTC.我们只会使用UTC,但似乎如果你使用ISO8601,你也可以使用一种普遍理解和明确的格式.Unix时间始终是UTC,所以你永远不必担心.

当然ISO8601有被人类可读的,当你在原始数据库,我不会有2038前不久重写几行代码的优势,但是这似乎并没有弥补缺点.

似乎通过写出来我实际上已经得到了答案;)无论如何,我很想知道别人的想法以及你在自己的项目中做了什么.请简要介绍一下您的用例,以便其他人可以更好地对您的输入进行分类.

谢谢!

timestamp iso8601 unix-timestamp

17
推荐指数
1
解决办法
4474
查看次数

MySQL插入到DATETIME:使用ISO :: 8601格式是否安全?

在我们的项目中,我们使用Zend Framework Model生成器,它生成类似这样的东西,将存储在DB(MySQL)中的属性设置为DATETIME字段:

public function setObjectDatetime($data) {
  if (! $data instanceof Zend_Date) { ... some conversion code ... }
  $this->objectDatetime = $data->toString(Zend_Date::ISO_8601);
}
Run Code Online (Sandbox Code Playgroud)

所以ISO :: 8601格式的字符串(例如'2012-06-15T18:33:00 + 03:00')实际上是作为属性存储的.

当我们尝试使用save此模型并将此字符串传递给MySQL(版本5.5.16)时会出现问题:它会引发警告,但仍会使用正确的结果插入/更新相应的行.很容易检查问题是由MySQL引起的,而不是某些驱动程序的行为:只是发出这样的查询...

UPDATE table_name SET datetime_field = '2012-06-15T18:33:00+03:00' WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

......其结果将是1 row affected, 1 warning,与

1264 | Out of range value for column 'dt' at row 1

警告(显示SHOW WARNINGS).

对我来说,phpMyAdmin根本没有显示任何警告; 并且所有服务器端代码都将此查询作为实体查询处理.)

所以问题是:我们是否应该将我们在模型中存储的内容重新格式化为另一种字符串格式(例如'YY-MM-dd HH:mm:ss'?)或者它是否只是一些奇怪的MySQL行为将被修复迟早?

mysql datetime iso8601

16
推荐指数
2
解决办法
3万
查看次数

是否有任何表示日期范围的标准?

ISO 8601代表日期YYYY-MM-DD.

它似乎没有提供任何关于如何表示日期范围的建议,例如:

2013-01-01 => 2013-06-31
Run Code Online (Sandbox Code Playgroud)

ISO 8601或其他标准是否为表示日期范围提供了明智的建议?

背景:这将被用作对象toString()方法的DateRange输出,然后可以使用parse()方法解析输出.

standards naming date iso8601 date-range

16
推荐指数
2
解决办法
3345
查看次数

春天启动Joda DateTime序列化

我正在尝试使用Spring Boot v1.2.0将Joda DateTime属性序列化为ISO-8601 .BUILD-SNAPSHOT这是我非常简单的REST应用程序.

@RestController
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    class Info{

       private DateTime dateTime;

        public Info(){
            dateTime = new DateTime();
        }
        public DateTime getDateTime() {
           return dateTime;
        }

        public void setDateTime(DateTime dateTime) {
           this.dateTime = dateTime;
        }
    }

    @RequestMapping("/info")
    Info info() {
        return new Info();
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
   public Module getModule(){
        return new JodaModule();
   }
}
Run Code Online (Sandbox Code Playgroud)

dateTime被序列化为时间戳,例如{"dateTime":1415954873412}我试过添加

    @Bean
    @Primary
    public ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper(); …
Run Code Online (Sandbox Code Playgroud)

datetime iso8601 jodatime jackson spring-boot

16
推荐指数
3
解决办法
2万
查看次数

UTC 与 ISO 时间格式

我试图了解 UTC 和 ISO 格式之间的区别以及在服务器之间传输消息时何时使用什么。所以当我尝试以下这就是我得到的

new Date().toISOString()
"2019-11-14T00:55:31.820Z"

new Date().toUTCString()
"Thu, 14 Nov 2019 00:55:16 GMT"
Run Code Online (Sandbox Code Playgroud)

我了解 ISO 格式及其用于表示时间的标准,但 UTC 的目的是什么,我将在哪里使用它们?

javascript time iso utc iso8601

16
推荐指数
1
解决办法
2万
查看次数

按ISO 8601日期排序数组

我怎样才能按日期排序这个数组(ISO 8601)?

var myArray = new Array();

myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' }
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' }
myArray[2] = { name:'old',    date:'2009-11-25T08:00:00Z' }
Run Code Online (Sandbox Code Playgroud)

游乐场:http :
//jsfiddle.net/4tUZt/

提前致谢!

javascript arrays sorting iso8601

15
推荐指数
4
解决办法
2万
查看次数

可以在MongoDB查询中使用严格的JSON $日期吗?

我正在尝试使用MongoDB 严格的BSON JSON表示编写日期比较查询.

我希望它能在MongoDB shell中工作(v2.4.3)

这是我试过的......

设置:创建一个at日期为2020年1月1日的新文档

> db.myTimes.insert({"at": new Date("2020-01-01")})
Run Code Online (Sandbox Code Playgroud)

对date> 2010使用非严格查询,没问题:

> db.myTimes.find({"at": {"$gt": new Date("2010-01-01")}})
{ "_id" : ObjectId([snipped]), "at" : ISODate("2020-01-01T00:00:00Z") }
Run Code Online (Sandbox Code Playgroud)

但是,使用严格的JSON查询... 没有骰子

> db.myTimes.find({"at": {"$gt": {"$date":"2010-01-01T00:00:00Z"}}})
> db.myTimes.find({"at": {"$gt": {"$date":"2010-01-01"}}})
> db.myTimes.find({"at": {"$gt": {"$date": 1262304000000}}})
> db.myTimes.find({"at": {"$lte": {"$date": 1262304000000}}})
Run Code Online (Sandbox Code Playgroud)

(正如你所看到的,我试过了ISO8601日期,大纪元时报,也改变了我$gt$lte的理论,这些将是互斥的,因此他们中的一个应该返回的东西:-)

感谢您的任何指示!

-B

date iso8601 epoch mongodb bson

15
推荐指数
1
解决办法
7972
查看次数

如何解析和生成ISO 8601格式的DateTime对象

有这个SOAP Web服务以下列格式向我发送datetime对象

2016-03-29T12:20:35.093-05:00
Run Code Online (Sandbox Code Playgroud)

那是2016年3月29日.时间:12:20:35.093(GMT-5).

我希望能够创建一个DateTime对象,如下所示:

DateTime.Now
Run Code Online (Sandbox Code Playgroud)

并获得上述格式的字符串表示以及逆操作,从上面给出的字符串创建一个DateTime.

我已经尝试了以下内容来创建日期:

new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc)
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何在那里指定GMT-5 ......

我不知道如何将DateTime转换为指定的字符串格式.

使用Nate的代码我正在做以下事情:

var d = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-3));

FormatIso8601(d)
Run Code Online (Sandbox Code Playgroud)

然而,这个电话正在回复:"2016-03-29T15:20:35Z"而不是:

"2016-03-29T12:20:35.093-03:00"
Run Code Online (Sandbox Code Playgroud)

这是我真正需要的.

我认为这有效:

        d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")
Run Code Online (Sandbox Code Playgroud)

.net c# datetime iso8601

15
推荐指数
2
解决办法
2万
查看次数

JSR-310中两个不同的基于周的年定义的动机是什么?

这些是包中的两个字段java.time.temporal:

IsoFields.WEEK_BASED_YEAR

WeekFields.ISO.weekBasedYear()

ISO-8601定义了除其他两种日期之外的所谓周日期,即通常的日历日期(包括年,月和日)和顺序日期(包括年和日) ).星期日的格式为YYYY-'W'ww-e.w代表一周的年份,e代表数字ISO-星期几.Y代表以周为基础的年份,与日历年相同,但在日历年的开始或结束时除外,因为基于周的年份与最终可能在上一年开始的周周期相关联.有两条规则对于理解星期日的形成非常重要:

  1. 周总是从周一开始.
  2. 日历年的第一周是包含至少四天的一周.

乍一看,两个JSR-310字段看起来都是相同的,因为ISO-8601只提到了一种基于周的年份.但是等一下,惊喜.让我们考虑以下代码示例:

LocalDate date1 = 
  LocalDate.of(2000, 2, 29).with(IsoFields.WEEK_BASED_YEAR, 2014);
System.out.println("IsoFields-Test: " + date1); // output: 2014-03-01

LocalDate date2 = 
  LocalDate.of(2000, 2, 29).with(WeekFields.ISO.weekBasedYear(), 2014);
System.out.println("WeekFields-Test: " + date2); // output: 2014-02-25
Run Code Online (Sandbox Code Playgroud)

虽然我非常了解第二种变化,但我很惊讶看到第一次约会的不同结果是在其类名中使用"官方"ISO-8601-reference.要解释计算结果:

2000-02-29日期对应于ISO-weekdate-notation中的2000-W09-2,而2014-02-25对应于2014-W09-2,保留了一周中的星期和星期几.到目前为止很好.较小字段的这种保留特性类似于如何更改日历年的规则(在大多数情况下应该保持日历日期中的月份和日期不变).

但结果2014-03-01是什么?这里算法简单地将相应的周日添加了四天,以便考虑字段"日期"(29对25)的差异.我没有找到此行为的任何来源或官方文档.有谁知道我们在哪里可以找到这两个领域之间差异的理由?有关算法行为的任何文档?

更新:

现在,我尝试使用此表达式测试新API的自我一致性,以便找出更好地支持哪两个字段:

System.out.println(
  "14 week-based-years later = "
  + LocalDate.of(2000, 2, 29).plus(14, IsoFields.WEEK_BASED_YEARS));
Run Code Online (Sandbox Code Playgroud)

输出是2014-03-01类似于描述的情况IsoFields.WEEK_BASED_YEAR,尽管我仍然发现2014-02-25(= 2014-W09-2)的结果更合乎逻辑.由于此类时间单元也在类中找到,IsoFields因此行为在类中是自洽的IsoFields.看起来像一个没有文档和非直观的"功能".

我使用的版本是:java.runtime.version = 1.8.0-b132

更多测试:

LocalDate d = LocalDate.of(2014, 3, 1); // 2014-W09-6
System.out.println( …
Run Code Online (Sandbox Code Playgroud)

java iso8601 java-8 java-time

14
推荐指数
1
解决办法
2010
查看次数

DateTime ISO 8601没有时区组件

我一直在为国际应用程序解析日期时间字符串.我遇到了一个解释问题,我似乎无法找到明确的答案. 是否应将没有时区组件的ISO 8601日期时间字符串视为本地时间?

每个维基百科(我不想根据我的业务决策):

如果没有给出具有时间表示的UTC关系信息,则假定时间是在本地时间.

但是,我无法通过ISO或任何其他普遍接受的事实来源找到支持文档.我发现的所有内容都谈到了如何处理当地时间的偏移(例如+/- 0500等).假设这些情况下的当地时间对我有很大帮助,因为我的用户可以为所有区域提交相同的日期,而无需计算每个区域的特定偏移量.

例如:

2012-01-01T00:00:00 # Convert to local
2012-01-01T00:00:00Z # Zulu/UTC...don't convert
Run Code Online (Sandbox Code Playgroud)

对于无时区的ISO 8601字符串,是否有既定的解释?

datetime localization iso8601

14
推荐指数
1
解决办法
6876
查看次数