`
cwqcwk1
  • 浏览: 86901 次
文章分类
社区版块
存档分类
最新评论

Erlang 日期和时间处理、时间戳转换

 
阅读更多

获取当前时间

erlang:now()得到的是从1970年1月1日零时起,到现在经过的时间,结果为{MegaSecs, Secs, MicroSecs}。有个问题要注意,还有另外一个函数可以实现同样的功能:os:timestamp()

那么erlang:now()和os:timestamp()的区别是什么?

erlang的解释如下:

erlang:now()

If you do not need the return value to be unique and monotonically increasing, use os:timestamp/0 instead to avoid some overhead.

os:timestamp()

The difference is that this function returns what the operating system thinks (a.k.a. the wall clock time) without any attempts at time correction. The result of two different calls to this function is not guaranteed to be different.

大致的意思是:os:timestamp()获取到的时间更接近于操作系统时间,erlang:now()每次获取都会生成唯一的时间,看来erlang:now()在实现上对时间多做了一个校正,相对os:timestamp()有点失真,同时也会有多余的开销。但是erlang:now()每次都生成唯一的值,有时候对我们来说也是一大利好的

获取当前时间戳

timestamp() ->
    {M, S, _} = os:timestamp(),
    M * 1000000 + S.
获取当前时间

% 本地时间
local_time() ->
    calendar:local_time().

% 世界时间
world_time() ->
    calendar:universal_time().

获取年月日,时分秒

1> {{Year, Month, Day}, {Hour, Minite, Second}} = calendar:local_time().
{{2013,11,13},{20,10,10}}
2> Day.
13
3> Second.
10
时间转换

% 秒转时间
11> calendar:seconds_to_daystime(86000).
{0,{23,53,20}}
12> calendar:seconds_to_daystime(86400).
{1,{0,0,0}}
13> calendar:seconds_to_daystime(1086400).
{12,{13,46,40}}

% 时间转秒
14> calendar:time_to_seconds({23,53,20}).
86000

时间与时间戳的转换

% 时间转时间戳,格式:{{2013,11,13}, {18,0,0}}
datetime_to_timestamp(DateTime) ->
    calendar:datetime_to_gregorian_seconds(DateTime) -
       calendar:datetime_to_gregorian_seconds({{1970,1,1}, {0,0,0}}).

% 时间戳转时间
timestamp_to_datetime(Timestamp) ->
    calendar:gregorian_seconds_to_datetime(Timestamp +
      calendar:datetime_to_gregorian_seconds({{1970,1,1}, {0,0,0}})).

时间格式化

-module(print_time).
-export([format_utc_timestamp/0]).
format_utc_timestamp() ->
    TS = {_,_,Micro} = os:timestamp(),
    {{Year,Month,Day},{Hour,Minute,Second}} = 
	calendar:now_to_universal_time(TS),
    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
			  "Aug","Sep","Oct","Nov","Dec"}),
    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
		  [Day,Mstr,Year,Hour,Minute,Second,Micro]).
编译这个模块,运行如下:

1> io:format("~s~n",[print_time:format_utc_timestamp()]).
29 Apr 2009  9:55:30.051711


解决时区问题

我们通过 erlang:now() 或者 os:timestamp() 获取到的时间都是标准世界时间,如果直接转成时间戳将会有偏差。

所以,erlang提供了很多 calendar:xxx_local_xxx 的方法用来做转换,使用时可以注意。见calendar文档

15> calendar:now_to_universal_time(erlang:now()).
{{2015,3,11},{16,43,48}}
16> calendar:now_to_local_time(erlang:now()).
{{2015,3,12},{0,44,13}}
17> calendar:universal_time_to_local_time({{1970,1,1}, {0,0,0}}).
{{1970,1,1},{8,0,0}}


2015/3/12 补充解决时区问题
参考:http://blog.csdn.net/mycwq/article/details/15813753


分享到:
评论

相关推荐

    dt:具有Postgres语义的Erlang日期时间库

    这个Erlang库的核心目标是帮助开发者在Erlang程序中处理日期时间数据时,能够与PostgreSQL数据库进行无缝交互。这通常意味着该库包含了PostgreSQL中的日期时间函数和操作,如时间戳转换、日期计算、时间间隔操作等,...

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    Erlang B和Erlang C是电信领域中两种重要的流量模型,用于预测和分析通信系统中的呼叫处理能力和拥塞情况。这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 ...

    erlang的timer和实现机制

    2. 计时:Erlang VM内部维护了一个时间戳,用于跟踪当前时间和定时器的到期时间。在进程调度时,VM会检查时间戳,判断是否有定时器到期。 3. 到期处理:当定时器到期时,VM会将相应的消息放入目标进程的消息队列,...

    Erlang和RabbitMQ安装包

    Erlang和RabbitMQ是两个在分布式系统和消息队列领域中至关重要的技术。Erlang是一种函数式编程语言,以其并发性、容错性和热代码升级能力而闻名,而RabbitMQ则是基于Erlang构建的一个开源消息代理,用于实现应用程序...

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建...通过阅读这本书,读者将能够理解Erlang如何处理并发、分布式计算和故障恢复,从而构建高效、健壮的软件系统。

    RabbitMQ3.9.13和ErLang24.2版本

    接下来,我们转向Erlang 24.2,它是RabbitMQ的依赖运行环境,因其并发处理能力和分布式特性而被选中。 1. **并发处理**:Erlang是一种面向并发的编程语言,其虚拟机(BEAM)设计支持轻量级进程,使得Erlang系统能...

    基于Erlang VM的语言

    - **Reia**的代码首先被转换为Erlang形式,然后由Erlang编译器处理成BEAM代码。 - **LFE**的Lisp形式代码首先转换为Core Erlang,然后编译为BEAM代码。 - **ErlyJS**的开发可能涉及从Reia的形式转换为LFE的形式,以...

    图书:Erlang和OTP实战

    书中的"Manning.Erlang.and.OTP.in.Action.2010.pdf"很可能是该书的电子版,读者可以通过这个PDF文件全面学习Erlang和OTP的知识,包括理论介绍、代码示例和实际案例分析,从而提升在并发处理和分布式系统开发方面的...

    erlang_版本24.3.4.4

    这个过程可能需要一些时间,因为它会编译整个Erlang虚拟机和标准库。编译完成后,你可以通过运行`make tests`来验证Erlang的正确性。 5. **安装**:最后,使用`make install`将编译好的Erlang二进制文件安装到你的...

    erlang 部分源码

    分析这部分源码,可以学习到Erlang如何高效地读写文件和处理网络数据。 10. **编译器和解析器** Erlang源代码首先由编译器转换为字节码,然后在BEAM虚拟机上运行。源码中可能包含编译器的实现,这有助于理解Erlang...

    erlang25.0 windows版本

    - **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中服务器、事件处理和状态机的通用行为。 - **Elixir**:基于Erlang VM的现代编程语言,提供了更接近Ruby的语法,同时保留了Erlang的并发特性和...

    Erlang22.3和RabbitMQ3.8.4.zip

    Erlang22.3和RabbitMQ3.8.4是两个紧密相关的技术组件,它们在分布式系统和消息队列领域中发挥着至关重要的作用。Erlang是一种并发性极强、容错性良好的编程语言,而RabbitMQ则是一个基于AMQP(Advanced Message ...

    Erlang官网下载过慢

    在Erlang和RabbitMQ的异步通信中,主要涉及以下几个概念: - 生产者(Producer):发送消息的应用。 - 消费者(Consumer):接收并处理消息的应用。 - 队列(Queue):存储消息的缓冲区,可以视为生产者和消费者之间...

    erlang lib of iconv

    总之,Erlang的iconv库是处理字符编码转换的关键工具,对于任何涉及到不同编码格式交互的Erlang开发者来说,理解和掌握它的使用方法都是非常重要的。通过熟练运用这个库,可以有效地解决跨编码环境下的数据处理问题...

    arrow:Erlang 日期时间实用程序

    箭 erlang datetime utils 建立在calender模块上 安装 ... 获取格式为{MegaSecs, Secs, MicroSecs}当前日期时间。 时间戳/0 timestamp() -> integer() 获取当前时间戳。 时间戳/1 timestamp(arrow

    erlang和rabbitmq.zip

    【标题】"erlang和rabbitmq.zip" 涉及到的是两个关键技术:Erlang编程语言和RabbitMQ消息队列系统。Erlang是一种并发性极强、容错性出色的函数式编程语言,而RabbitMQ是基于Erlang开发的开源消息代理和队列服务器。 ...

    xiandiao_erlang_Erlang课后习题_

    5. **简洁的错误处理**:Erlang使用“let it crash”哲学,鼓励快速失败和快速恢复。错误通常通过抛出异常来处理,而不是通过复杂的错误检查逻辑。 6. **模式匹配**:Erlang的函数调用允许模式匹配,使得解构复杂...

    Erlang_CNode用户指

    3. **Erlang数据类型和API**:介绍CNode API,包括如何在C中表示和操作Erlang的数据类型(如整数、原子、列表等),以及如何调用Erlang函数和处理返回结果。 4. **进程通信**:阐述如何在CNode中创建Erlang进程,...

Global site tag (gtag.js) - Google Analytics