Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不同时区的Javascript日期格式_Javascript - Fatal编程技术网

不同时区的Javascript日期格式

不同时区的Javascript日期格式,javascript,Javascript,我是一名Java开发人员,我习惯了SimpleDataFormat类,它允许我通过设置时区将任何日期格式化为任何格式 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); System.out.println(sdf.format(date)

我是一名Java开发人员,我习惯了SimpleDataFormat类,它允许我通过设置时区将任何日期格式化为任何格式

Date date = new Date();

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");

sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
System.out.println(sdf.format(date)); // Prints date in Los Angeles

sdf.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
System.out.println(sdf.format(date)); // Prints same date in Chicago
SimpleDataFormat在Java中是一个非常简洁的解决方案,但不幸的是,我在Javascript中找不到任何类似的替代方案

我在Javascript中扩展日期原型,以实现完全相同的功能。我有Unix格式的日期,但我想在不同的时区中设置日期的格式

Date.prototype.format = function(format, timezone) {
    // Now what?
    return formattedDate;
}
我正在寻找一个简洁的方法来做这件事,而不是一个黑客


谢谢

不要自己写东西;只需获取datejs:

您可以通过以下方式确定在执行环境中时区偏移量的设置:

var local = new Date();
var utc = Date.UTC(local.getFullYear(), local.getMonth(), local.getDate(), local.getHours(), local.getMinutes(), local.getSeconds(), local.getMilliseconds());
var tz = (utc - local.getTime()) / (60 * 60 * 1000);

如果你只是通过了原始测试,那么调整时间并没有什么复杂的事情。 我下面的例子当然是缩写的。根据你处理的图案数量,你的图案可能会很长

Date.prototype.format = function(format, tzAdjust) {
    // adjust timezone
    this.setHours(this.getHours()+tzAdjust)
    // pad zero helper - return "09" or "12"
    var two = function(s){ return s+"".length==1 ? "0"+s : s+""; }
    // replace patterns with date numbers
    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){
        switch(pattern){
            case "d" : return this.getDate();
            case "dd" : return two(this.getDate());
        }
    });
}
试图(稍微)改进mwilcox的建议:

Date.prototype.format = function(format, tzAdjust) {

    // get/setup a per-date-instance tzDate object store
    var tzCache = this.__tzCache = this.__tzCache || (this.__tzCache = {});

    // fetch pre-defined date from cache 
    var tzDate = tzCache[tzAdjust];
    if ( !tzDate )
    {
      // on miss - then create a new tzDate and cache it
      tzDate = tzCache[tzAdjust] = new Date( this );
      // adjust by tzAdjust (assuming it's in minutes 
      // to handle those weird half-hour TZs :) 
      tzDate.setUTCMinutes( tzDate.getUTCMinutes()+tzAdjust );
    }

    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){
               // replace each format tokens with a value 
               // based on tzDate's corresponding UTC property
             });
}

很明显,你在一个地方问了两个问题:格式和时区。它们需要单独处理。格式化是非常简单的,如果没有其他答案可以做到这一点,你就必须更加具体

至于时间和时区,如果您让服务器将UTC时间(最好是以毫秒为单位的UNIX时间)注入JavaScript,您可以将其与客户端计算机上的时间进行比较,从而计算出客户端离UTC的距离。然后你可以计算你想要的任何时区的时间

编辑:事实上,我不知道JavaScript也在UTC时间内构建,直到我在互联网上检查,整洁

无论如何,我想这是你想要的:

Date.prototype.format=function(format,timezone){
    var obj=new Date(this.getTime()+this.getTimezoneOffset()*60000+timezone*3600000);
    var two=function(s){
        return s<10?"0"+s:s+"";
    }
    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){
        switch(pattern){
            case "dd" : return two(obj.getDate());
            case "MM" : return two(obj.getMonth()+1);
            case "yyyy" : return obj.getFullYear();
            case "hh" : return two(obj.getHours());
            case "mm" : return two(obj.getMinutes());
            case "ss" : return two(obj.getSeconds());
        }
    });
}
Date.prototype.format=函数(格式,时区){
var obj=新日期(this.getTime()+this.getTimezoneOffset()*60000+时区*3600000);
变量二=函数{

return sJavaScript不支持本地时区以外的其他时区。只能以本地时间或UTC时间表示日期。无法更改日期对象的时区偏移量


因此,没有“简洁”的方法来解决您的问题。

通用日期的ISO扩展格式为YYYY-MM-DD,时间的ISO扩展格式为hh:MM:ss。这两种格式都可以在全球范围内明确理解

另见:
这是一个老问题,但自从我发现它之后:

如前所述,没有任何合理的内置功能

至于LIB,则有一个

下面是一个JSFIDLE示例:

相同的内联代码:

var m = moment("2014-06-01T13:05:00Z");
var f = "HH:mm z";

$("#results").text(m.tz("UTC").format(f) + " is " + m.tz("EST").format(f) +  "!");

有一种方法可以设置时区的格式

console.log(new Date().toLocaleDateString('en-US', {timeZone: 'America/Denver'}))
// 11/13/2018
console.log(new Date().toLocaleTimeString('en-US', {timeZone: 'America/Denver'}))
// 2:30:54 PM
console.log(new Date().toLocaleTimeString('en-US', {timeZone: 'America/New_York'}))
// 4:31:26 PM


因为我的需求是一个typescript解决方案,但我在这里遇到了麻烦,所以我曾经编写我的typescript函数

基于上述答案,typescript中的一个函数,它将时间戳或日期对象转换为格式化的本地时间字符串

const formatDateString = (date_or_ts:Date|number):string=>{
    let obj:Date;

    if(typeof date_or_ts === "number"){
        obj = new Date(date_or_ts*1000);
        // obj=new Date(obj.getTime()+obj.getTimezoneOffset()*60000+timezone*3600000);
    }else{
        obj = date_or_ts;
    }
    const format = "dd-MM-yyyy hh:mm:ss";
    let two=function(s:number){
        return s<10?"0"+s:s+"";
    }
    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){
        const months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
        switch(pattern){
            case "dd" : return two(obj.getDate()).toString();
            case "MM" : return months[obj.getMonth()];
            case "yyyy" : return obj.getFullYear().toString();
            case "hh" : return two(obj.getHours()).toString();
            case "mm" : return two(obj.getMinutes()).toString();
            case "ss" : return two(obj.getSeconds()).toString();
            default: return "";
        }
    });
}
const formatDateString=(date_或_ts:date | number):string=>{
让obj:日期;
如果(日期类型或编号){
obj=新日期(日期*1000);
//obj=新日期(obj.getTime()+obj.getTimezoneOffset()*60000+时区*3600000);
}否则{
obj=日期;
}
const format=“dd-MM-yyy-hh:MM:ss”;
设二=函数(s:编号){

return实现这一点并不容易。JavaScript几乎不支持或根本不支持时区。在我构建的一个日历应用程序中,我有超过几页的代码来处理日期和时区,其中包括一个大型XML文件,必须从包含城市及其对应区域的服务器上下载,以及它们的夏令时ules。假设我提供了GMT原始偏移量,这会使它更容易吗?目标是处理时区,DateJS似乎没有这样做。Alpha在2007年发布,此后没有任何活动。这不是一个非常干净的解决方案。因为假设您要将同一日期格式化两次,它将被调整两次。另一方面,getHours返回上的小时用户的时区,添加原始偏移量是不够的,还需要考虑用户的时区(GETTimeZONoOffSET()).无论如何,使用setHours会改变日期,这是一种错误的处理日期的方式。电子商务,我不是一问两个问题。在许多编程语言中,日期对象不会随时区而改变,而是它的显示方式发生了变化。现在,世界各地的日期都是相同的,但显示方式不同。如果您看我的Java示例,请注意我是如何使用两种不同的日期格式显示相同的日期对象的。您链接的TechRepublic页面上的注释表明提供的解决方案(和脚本)非常差且不正确……有一种方法可以获得偏移量,而且下面的答案似乎更正确