首页 文章

将UTC日期时间转换为本地日期时间

提问于
浏览
243

从服务器我得到这种格式的日期时间变量: 6/29/2011 4:52:48 PM ,它是UTC时间 . 我想使用JavaScript将其转换为当前用户的浏览器时间 .

如何使用JavaScript或jQuery完成此操作?

23 回答

  • 1

    这是一个基于Adorjan Princ答案的简化解决方案:

    function convertUTCDateToLocalDate(date) {
        var newDate = new Date(date);
        newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
        return newDate;
    }
    

    用法:

    var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
    
  • 295

    对我来说上面的解决方案没有用 .

    使用IE,将UTC日期时间转换为本地有点棘手 . 对我来说,来自Web API的日期时间是 '2018-02-15T05:37:26.007' ,我想按照本地时区进行转换,所以我在JavaScript中使用了以下代码 .

    var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
    
  • -1

    这对我有用:

    function convertUTCDateToLocalDate(date) {
        var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
        return newDate;   
    }
    
  • 4

    用于UTC和本地时间转换,反之亦然 .

    //Covert datetime by GMT offset 
    //If toUTC is true then return UTC time other wise return local time
    function convertLocalDateToUTCDate(date, toUTC) {
        date = new Date(date);
        //Local time converted to UTC
        console.log("Time: " + date);
        var localOffset = date.getTimezoneOffset() * 60000;
        var localTime = date.getTime();
        if (toUTC) {
            date = localTime + localOffset;
        } else {
            date = localTime - localOffset;
        }
        date = new Date(date);
        console.log("Converted time: " + date);
        return date;
    }
    
  • 83

    我写了一个漂亮的小脚本,它接受一个UTC纪元并将其转换为客户端系统时区并以d / m / Y H:i:s(如PHP日期函数)格式返回:

    getTimezoneDate = function ( e ) {
    
        function p(s) { return (s < 10) ? '0' + s : s; }        
    
        var t = new Date(0);
        t.setUTCSeconds(e);
    
        var d = p(t.getDate()), 
            m = p(t.getMonth()+1), 
            Y = p(t.getFullYear()),
            H = p(t.getHours()), 
            i = p(t.getMinutes()), 
            s = p(t.getSeconds());
    
        d =  [d, m, Y].join('/') + ' ' + [H, i, s].join(':');
    
        return d;
    
    };
    
  • 6

    基于@digitalbath答案,这里有一个小函数来获取UTC时间戳并在给定的DOM元素中显示本地时间(在最后一部分使用jQuery):

    https://jsfiddle.net/moriz/6ktb4sv8/1/

    <div id="eventTimestamp" class="timeStamp">
       </div>
       <script type="text/javascript">
       // Convert UTC timestamp to local time and display in specified DOM element
       function convertAndDisplayUTCtime(date,hour,minutes,elementID) {
        var eventDate = new Date(''+date+' '+hour+':'+minutes+':00 UTC');
        eventDate.toString();
        $('#'+elementID).html(eventDate);
       }
       convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');
       </script>
    
  • 8

    如果您不介意使用 moment.js 并且您的时间是UTC,请使用以下内容:

    moment.utc('6/29/2011 4:52:48 PM').toDate();
    

    如果您的时间不在utc中,而是您知道的任何其他语言环境,请使用以下内容:

    moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();
    

    如果您的时间已经在本地,请使用以下内容:

    moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');
    
  • 79

    JSON日期字符串(在C#中序列化)看起来像“2015-10-13T18:58:17” .

    在角度中,(在Hulvej之后)制作一个 localdate 过滤器:

    myFilters.filter('localdate', function () {
        return function(input) {
            var date = new Date(input + '.000Z');
            return date;
        };
    })
    

    然后,显示当地时间如:

    {{order.createDate | localdate | date : 'MMM d, y h:mm a' }}
    
  • -1

    在Angular中,我用Ben的答案:

    $scope.convert = function (thedate) {
        var tempstr = thedate.toString();
        var newstr = tempstr.toString().replace(/GMT.*/g, "");
        newstr = newstr + " UTC";
        return new Date(newstr);
    };
    

    编辑:Angular 1.3.0添加了UTC支持到日期过滤器,我还没有使用它但它应该更容易,这里是格式:

    {{ date_expression | date : format : timezone}}
    

    Angular 1.4.3 Date API

  • 0

    Matt的答案是错过了Date()和它需要转换的日期时间之间的夏令时可能不同的事实 - 这是我的解决方案:

    function ConvertUTCTimeToLocalTime(UTCDateString)
        {
            var convertdLocalTime = new Date(UTCDateString);
    
            var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;
    
            convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset ); 
    
            return convertdLocalTime;
        }
    

    调试器中的结果:

    UTCDateString: "2014-02-26T00:00:00"
    convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)
    
  • 9

    对我来说,最简单的似乎是使用

    datetime.setUTCHours(datetime.getHours());
    datetime.setUTCMinutes(datetime.getMinutes());
    

    (我认为第一行可能已经足够了,但是有些时区会在几小时内关闭)

  • 2
    function getUTC(str) {
        var arr = str.split(/[- :]/);
        var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
        utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000)
        return utc;
    }
    

    对于其他访问者 - 使用此函数从UTC字符串中获取本地日期对象,应该处理DST并将在IE,IPhone等上工作 .

    我们拆分了字符串(因为某些浏览器不支持JS日期解析)我们从UTC获得差异并从UTC时间中减去它,这给了我们当地时间 . 由于返回的偏移量是使用DST计算的(如果我错了,请更正我),因此它会将该时间设置回变量“utc” . 最后返回日期对象 .

  • 19

    我回答这个如果任何人想要显示转换时间到特定id元素的函数并应用日期格式字符串yyyy-mm-dd这里date1是字符串而ids是时间要显示的元素的id .

    function convertUTCDateToLocalDate(date1, ids) 
    {
      var newDate = new Date();
      var ary = date1.split(" ");
      var ary2 = ary[0].split("-");
      var ary1 = ary[1].split(":");
      var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
      newDate.setUTCHours(parseInt(ary1[0]));
      newDate.setUTCMinutes(ary1[1]);
      newDate.setUTCSeconds(ary1[2]);
      newDate.setUTCFullYear(ary2[0]);
      newDate.setUTCMonth(ary2[1]);
      newDate.setUTCDate(ary2[2]);
      ids = document.getElementById(ids);
      ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds();
                }
    

    我知道答案已被接受,但我得到谷歌的原因,我确实解决了从接受的答案获得灵感所以我想要分享它,如果有人需要 .

  • 3

    @Adorojan's 答案几乎是正确的 . 但是添加偏移是不正确的,因为如果浏览器日期早于GMT,则偏移值将为负,反之亦然 . 以下是我带来的解决方案,对我来说工作得非常好:

    // Input time in UTC
    var inputInUtc = "6/29/2011 4:52:48";
    
    var dateInUtc = new Date(Date.parse(inputInUtc+" UTC"));
    //Print date in UTC time
    document.write("Date in UTC : " + dateInUtc.toISOString()+"<br>");
    
    var dateInLocalTz = convertUtcToLocalTz(dateInUtc);
    //Print date in local time
    document.write("Date in Local : " + dateInLocalTz.toISOString());
    
    function convertUtcToLocalTz(dateInUtc) {
    		//Convert to local timezone
    		return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000);
    }
    
  • 1

    在将字符串转换为javascript中的日期之前,将“UTC”附加到字符串:

    var date = new Date('6/29/2011 4:52:48 PM UTC');
    date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
    
  • 7

    将此功能放在头脑中:

    <script type="text/javascript">
    function localize(t)
    {
      var d=new Date(t+" UTC");
      document.write(d.toString());
    }
    </script>
    

    然后为页面正文中的每个日期生成以下内容:

    <script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>
    

    要删除GMT和时区,请更改以下行:

    document.write(d.toString().replace(/GMT.*/g,""));
    
  • 1

    使用 YYYY-MM-DD hh:mm:ss 格式:

    var date = new Date('2011-06-29T16:52:48+00:00');
    date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
    

    要从 YYYY-MM-DD hh:mm:ss 格式转换,请确保您的日期遵循ISO 8601 format .

    Year: 
        YYYY (eg 1997)    
    Year and month: 
        YYYY-MM (eg 1997-07)
    Complete date: 
        YYYY-MM-DD (eg 1997-07-16)
    Complete date plus hours and minutes:
        YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)    
    Complete date plus   hours, minutes and seconds:
        YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)    
    Complete date plus hours, minutes, seconds and a decimal fraction of a second
        YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where:
    
    YYYY = four-digit year
    MM   = two-digit month (01=January, etc.)
    DD   = two-digit day of month (01 through 31)
    hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
    mm   = two digits of minute (00 through 59)
    ss   = two digits of second (00 through 59)
    s    = one or more digits representing a decimal fraction of a second
    TZD  = time zone designator (Z or +hh:mm or -hh:mm)
    

    Important things to note

    • 您必须用 T 分隔日期和时间,某些浏览器中的空格不起作用

    • 您必须使用此格式 +hh:mm 设置时区,使用时区字符串(例如:'UTC')将无法在许多浏览器中使用 . +hh:mm 表示与UTC时区的偏移量 .

  • 10

    在末尾添加时区,在本例中为“UTC”:

    theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));
    

    之后,使用 toLocale()* 函数系列以正确的语言环境显示日期

    theDate.toLocaleString();  // "6/29/2011, 9:52:48 AM"
    theDate.toLocaleTimeString();  // "9:52:48 AM"
    theDate.toLocaleDateString();  // "6/29/2011"
    
  • 9

    您可以使用 momentjsmoment(date).format() 将始终在 local date 中给出结果 .

    Bonus ,您可以以任何方式格式化 . 例如 .

    moment().format('MMMM Do YYYY, h:mm:ss a'); // September 14th 2018, 12:51:03 pm
    moment().format('dddd');                    // Friday
    moment().format("MMM Do YY");
    

    有关详细信息,请参阅Moment js website

  • 3

    这是一个通用的解决方案:

    function convertUTCDateToLocalDate(date) {
        var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000);
    
        var offset = date.getTimezoneOffset() / 60;
        var hours = date.getHours();
    
        newDate.setHours(hours - offset);
    
        return newDate;   
    }
    

    用法:

    var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
    

    根据客户端本地设置显示日期:

    date.toLocaleString();
    
  • 6

    您应该获得客户端的(UTC)偏移量(以分钟为单位):

    var offset = new Date().getTimezoneOffset();
    

    然后通过相应的添加或减少从服务器获得的时间 .

    希望这可以帮助 .

  • 32

    在尝试了其他几个没有好结果的人之后,这似乎对我有用:

    convertUTCDateToLocalDate: function (date) {
        return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),  date.getHours(), date.getMinutes(), date.getSeconds()));
    }
    

    从Local Date到UTC,这种方式正好相反:

    convertLocalDatetoUTCDate: function(date){
        return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
    }
    
  • 1

    在我看来,服务器应该总是在一般情况下返回 standardized ISO 8601-format 中的日期时间 .

    更多信息:

    在这种情况下,服务器将返回 '2011-06-29T16:52:48.000Z' ,它将直接提供给JS Date对象 .

    var utcDate = '2011-06-29T16:52:48.000Z';  // ISO-8601 formatted date returned from server
    var localDate = new Date(utcDate);
    

    localDate 将在正确的当地时间,在我的情况下将是两小时后(DK时间) .

    你真的不需要做所有这些只会让事情变得复杂的解析,只要你与服务器期望的格式一致即可 .

相关问题