无法格式化默认 MySQL 日期时间

Posted

技术标签:

【中文标题】无法格式化默认 MySQL 日期时间【英文标题】:Unable to format default MySQL datetime 【发布时间】:2014-01-09 16:29:09 【问题描述】:

我的日期从数据库中出来,如下所示:2013-11-21 17:43:20

我正在尝试使用 Angular 的日期过滤器将它们变成更漂亮的东西,但是...

Objected.created | date:'shortDate'

Objected.created | date:'YYYY'

...只是吐出原始日期时间字符串:2013-11-21 17:43:20。没有错误。我做错了什么?

更新 我看到 mysql 的默认日期时间与 Angular 的数据过滤器所期望的不兼容。我正在尝试像这样即时转换它,但它会抛出错误:

<li ng-repeat="result in data"> new Date(result.Job.created).toISOString() | date:'shortDate'</li>

我怀疑我无法以我尝试的方式实例化 Date 类。错误是 $parse:syntax 错误。

更新

感谢@m59 的帮助,我做了一些小的调整...

html

<html ng-app="myApp">
...
Object.created | dateToISO | date:'shortDate'

JS:

var myApp = angular.module('myApp',[]);

myApp.filter('dateToISO', function() 
  return function(input) 
    input = new Date(input).toISOString();
    return input;
  ;
);

这个自定义过滤器将默认的 MySQL 日期时间转换为日期过滤器期望的格式,所以我发送它一个接着一个,然后“瞧”。

【问题讨论】:

【参考方案1】:

你指定的日期格式错误YYYY应该是yyyy,其他例子看documentation。

此外,您尝试格式化的日期字符串与 Angular 的规范不匹配。

日期格式为日期对象、毫秒(字符串或数字)或各种 ISO 8601 日期时间字符串格式(例如 yyyy-MM-ddTHH:mm:ss.SSSZ 及其较短的版本,如 yyyy-MM-ddTHH:mmZ, yyyy-MM-dd 或 yyyyMMddTHHmmssZ)。如果字符串输入中没有指定时区,则时间被认为是本地时区。

无论您从何处检索原始字符串,我建议您以其中一种格式存储/尝试检索它。

示例JSFiddle 使用正确的格式。

【讨论】:

【参考方案2】:

您需要将日期字符串转换为 Angular 支持的格式,例如 ISO 8601 格式。你可以这样转换:

$scope.Object.created = new Date($scope.Object.created).toISOString();

Live demo here (click).

要即时执行此操作,您需要一个自定义过滤器。 Live demo here (click).

标记:

<div>Object.created | dateToISO | date:'shortDate'</div>

JavaScript:

app.filter('dateToISO', function() 
  return function(input) 
    return new Date(input).toISOString();
  ;
);

更新:

这是手动转换日期的简单方法(firefox):

app.filter('badDateToISO', function() 
  return function(badTime) 
    var goodTime = badTime.replace(/(.+) (.+)/, "$1T$2Z");
    return goodTime;
  ;
);

【讨论】:

是否可以在 内部即时进行这种转换?我是 Angular 的新手,尝试时它会抛出错误(请参阅上面的更新)。 看起来很棒!我所有的工作都在一个角度控制器内。我还没有在任何地方定义app。我的文档顶部有:&lt;html ng-app&gt;。这会自动定义它吗? 感谢您的帮助! Firefox 失败...invalid date 我不明白为什么 Angular 不支持 MySQL DATETIME 开箱即用,它是最常用的数据库之一【参考方案3】:

我为此创建了一个管道,如下所示

import  Pipe  from "@angular/core";

@管道( 名称:'DateToIso' ) 导出类 DateToIso

transform(value, args) 

var regex=/^([0-9]2,4)-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;

var parts=value.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');

var converted = new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);

let newValue = converted.toISOString();

return newValue;


【讨论】:

【参考方案4】:

我创建了一个管道

import  Pipe  from "@angular/core";

@管道( 名称:DateToIso' ) 导出类 DateToIso

transform(value, args) 

var regex=/^([0-9]2,4)-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;

var parts=value.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');

var converted = new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);

let newValue = converted.toISOString();

return newValue;


然后在模板中使用

 p.sessionTimeFinish | DateToIso  |  date: "HH:mm" 

【讨论】:

【参考方案5】:

Angular 2 管道

import  Pipe, PipeTransform  from '@angular/core';

@Pipe(
  name: 'toIso'
)
export class ToIsoPipe implements PipeTransform 
  transform(value: string): unknown 
    return value.replace(' ', 'T');
  


// INPUT : "2020-08-20 09:00:20"
// OUTPUT : "2020-08-20T09:00:20"

示例

response.created | toIso | date:'MMM d, h:mm a'

【讨论】:

以上是关于无法格式化默认 MySQL 日期时间的主要内容,如果未能解决你的问题,请参考以下文章

向 Grails 发送日期时的 GORM 默认日期格式

使用 jQuery datepicker 自定义日期格式验证(无法摆脱美国日期验证)

Openoffice-calc 无法更改列的日期格式

无法在 jQuery DatePicker 中使用格式“yyy-dd-mm HH:MM:ss”来保存 MySQL DateTime 字段

java 数据库增加日期字段后无法导出Excel

MySQL 用 BETWEEN AND 日期查询包含范围边界