在epoch中转换日期格式

时间:2011-07-14 01:13:20

标签: java datetime date epoch

我有一个日期格式的字符串,例如

Jun 13 2003 23:11:52.454 UTC

包含millisec ...我想在epoch中转换。 是否有Java中的实用程序可用于执行此转换?

5 个答案:

答案 0 :(得分:86)

此代码显示如何使用java.text.SimpleDateFormat从字符串中解析java.util.Date

String str = "Jun 13 2003 23:11:52.454 UTC";
SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz");
Date date = df.parse(str);
long epoch = date.getTime();
System.out.println(epoch); // 1055545912454

Date.getTime()以毫秒为单位返回纪元时间。

答案 1 :(得分:21)

您也可以使用新的Java 8 API

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class StackoverflowTest{
    public static void main(String args[]){
        String strDate = "Jun 13 2003 23:11:52.454 UTC";
        DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz");
        ZonedDateTime     zdt  = ZonedDateTime.parse(strDate,dtf);        
        System.out.println(zdt.toInstant().toEpochMilli());  // 1055545912454  
    }
}

DateTimeFormatter课程取代旧的SimpleDateFormat。然后,您可以创建一个ZonedDateTime,您可以从中提取所需的纪元时间。

主要优点是您现在是线程安全的。

感谢Basil Bourque的评论和建议。阅读他的答案以获取全部细节。

答案 2 :(得分:5)

TL;博士

ZonedDateTime.parse( 
                        "Jun 13 2003 23:11:52.454 UTC" , 
                        DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ) 
                    )
              .toInstant()
              .toEpochMilli()
  

1055545912454

java.time

本答案扩展了Answer by Lockni

DateTimeFormatter

首先通过创建DateTimeFormatter对象来定义格式化模式以匹配输入字符串。

String input = "Jun 13 2003 23:11:52.454 UTC";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" );

ZonedDateTime

将字符串解析为ZonedDateTime。您可以将该课程视为:(Instant + ZoneId)。

ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f );
  

zdt.toString():2003-06-13T23:11:52.454Z [UTC]

Table of types of date-time classes in modern java.time versus legacy.

计数-从历元

我不建议将日期时间值作为计数来自epoch。这样做会使调试变得棘手,因为人类无法从数字中辨别出有意义的日期时间,因此无效/意外值可能会漏掉。此类计数也是模糊的,粒度(整秒,毫秒,微米,纳米等)和时期(各种计算机系统中至少二十几个)。

但是如果你坚持认为你可以从1970年的第一个时刻(UTC {1970-01-01T00:00:00)到Instant级获得毫秒数。请注意,这意味着数据丢失,因为您将任何纳秒缩短为毫秒。

Instant instant = zdt.toInstant ();
  

instant.toString():2003-06-13T23:11:52.454Z

long millisSinceEpoch = instant.toEpochMilli() ; 
  

1055545912454

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:0)

创建将字符串转换为日期格式的通用方法

# -*- coding: utf-8 -*-
import codecs


def get_file_bom_encodig(filename):
    with open (filename, 'rb') as openfileobject:
        line = str(openfileobject.readline())
        if line[2:14] == str(codecs.BOM_UTF8).split("'")[1]: return 'utf_8'
        if line[2:10] == str(codecs.BOM_UTF16_BE).split("'")[1]: return 'utf_16'
        if line[2:10] == str(codecs.BOM_UTF16_LE).split("'")[1]: return 'utf_16'
        if line[2:18] == str(codecs.BOM_UTF32_BE).split("'")[1]: return 'utf_32'
        if line[2:18] == str(codecs.BOM_UTF32_LE).split("'")[1]: return 'utf_32'
    return ''

def get_all_file_encoding(filename):
    encoding_list = []
    encodings = ('utf_8', 'utf_16', 'utf_16_le', 'utf_16_be', 
                 'utf_32', 'utf_32_be', 'utf_32_le',
                 'cp850' , 'cp437', 'cp852', 'cp1252', 'cp1250' , 'ascii',
                 'utf_8_sig', 'big5', 'big5hkscs', 'cp037', 'cp424', 'cp500',
                 'cp720', 'cp737', 'cp775', 'cp855', 'cp856', 'cp857',
                 'cp858', 'cp860', 'cp861', 'cp862', 'cp863', 'cp864',
                 'cp865', 'cp866', 'cp869', 'cp874', 'cp875', 'cp932',
                 'cp949', 'cp950', 'cp1006', 'cp1026', 'cp1140', 'cp1251',
                 'cp1253', 'cp1254', 'cp1255', 'cp1256', 'cp1257', 
                 'cp1258', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213',
                 'euc_kr', 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp',
                 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004',
                 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', 'latin_1',
                 'iso8859_2', 'iso8859_3', 'iso8859_4', 'iso8859_5',
                 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9',
                 'iso8859_10', 'iso8859_13', 'iso8859_14', 'iso8859_15',
                 'iso8859_16', 'johab', 'koi8_r', 'koi8_u', 'mac_cyrillic',
                 'mac_greek', 'mac_iceland', 'mac_latin2', 'mac_roman',
                 'mac_turkish', 'ptcp154', 'shift_jis', 'shift_jis_2004',
                 'shift_jisx0213'
                 )  
    for e in encodings:
        try:
            fh = codecs.open(filename, 'r', encoding=e)
            fh.readlines()
        except UnicodeDecodeError:
            fh.close()
        except UnicodeError:
            fh.close()
        else:
            encoding_list.append([e])
            fh.close()
            continue     
    return encoding_list

def get_file_encoding(filename):
        file_encoding = get_file_bom_encodig(filename)
        if file_encoding != '':
            return file_encoding
        encoding_list = get_all_file_encoding(filename)
        file_encoding = str(encoding_list[0][0])
        if file_encoding[-3:] == '_be' or file_encoding[-3:] == '_le':
            file_encoding = file_encoding[:-3]
        return file_encoding        

def main():
    print('This Python script is only for import functionality, it does not run interactively')

if __name__ == '__main__':
    main()

答案 4 :(得分:0)

  String dateTime="15-3-2019 09:50 AM" //time should be two digit like 08,09,10 
   DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm a");
        LocalDateTime zdt  = LocalDateTime.parse(dateTime,dtf);
        LocalDateTime now = LocalDateTime.now();
        ZoneId zone = ZoneId.of("Asia/Kolkata");
        ZoneOffset zoneOffSet = zone.getRules().getOffset(now);
        long a= zdt.toInstant(zoneOffSet).toEpochMilli();
        Log.d("time","---"+a);

您可以从此a link获取区域ID!