我正在尝试在React Native中设置日期字符串的格式。
示例:2016年1月4日10:34:23
下面是我使用的代码。
var date = new Date("2016-01-04 10:34:23");
console.log(date);
我的问题是,当我在iPhone6S上模拟时,它会毫无问题地打印出Mon Jan 04 2016 10:34:23 GMT+0530 (IST)
。但如果我在iPhone5S上尝试,它什么也不打印。如果你尝试使用date.getMonth()
这样的方法来获取月份,它会打印"NaN"
。
为什么会这样?解决方案是什么?
9条答案
按热度按时间edqdpe6u1#
ReactNative的美妙之处在于它支持大量的JS库,如Moment.js。使用Moment.js处理日期/时间是一种更好/更简单的方法,而不是从头开始编码
只需在终端中运行此命令(如果使用React的内置包管理器,
yarn add moment
也可以工作):在您的React Native js页面中:
您可以在这里查看moment.js官方文档https://momentjs.com/docs/
w51jfk4q2#
使用软件包即可轻松完成。
其他人也提到了Moment。Moment很棒,但是对于像这样的简单使用来说非常大,不幸的是不是模块化的,所以你必须导入整个包才能使用其中的任何一个。
我推荐使用date-fns(https://date-fns.org/)(https://github.com/date-fns/date-fns),它是轻量级的,模块化的,所以你可以只导入你需要的函数。
在您的情况下:
npm install date-fns --save
将
"MMMM do, yyyy H:mma"
上面的格式字符串替换为所需的任何格式。更新:v1与v2格式差异
v1使用
Y
表示年,使用D
表示日,而v2使用y
和d
。上述格式字符串已针对v2进行了更新;v1的等效值为"MMMM Do, YYYY H:mma"
(来源:https://blog.date-fns.org/post/unicode-tokens-in-date-fns-v2-sreatyki91jg/)。谢谢@Rednxagd54h3#
不需要包含庞大的库(如Moment.js)来解决这样一个简单的问题。
您所面临的问题不是格式化,而是解析。
正如John Shammas在另一个答案中提到的,
Date
构造函数(和Date.parse
)对输入很挑剔,您的2016-01-04 10:34:23
可能在一个JavaScript实现中工作,但不一定在另一个中工作。根据ECMAScript 5.1的规范,
Date.parse
支持(简化的)ISO 8601。这是个好消息,因为您的日期已经非常像ISO 8601了。你所要做的就是稍微改变一下输入格式,把空格换成
T
:2016-01-04T10:34:23
;并可选择添加时区(2016-01-04T10:34:23+01:00
),否则假定为UTC。ccgok5k54#
编写下面的函数来获取字符串格式的日期,转换并返回字符串格式.
**在您需要的地方打印:**日期:{此.getParsedDate(字符串日期)}
rfbsl7qr5#
momentjs
的轻量级替代方案是dayjs
您可以使用yarn或npm进行安装
qv7cva1a6#
Date构造函数对它所允许的内容非常挑剔。传入的字符串必须得到Date.parse()的支持,如果不支持,它将返回NaN。不同版本的JavaScript支持不同的格式,如果这些格式与ISO官方文档不同的话。
请参阅此处的示例了解支持的内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
8ftvxx2r7#
由于日期字符串解析的差异,建议始终手动解析字符串,因为结果不一致,尤其是在不同ECMAScript实现之间,其中“2015-10-12 12:00:00”等字符串可能被解析为NaN、UTC或本地时区。
...如资源中所述:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
7fyelxc58#
这是我的解决办法。
qzlgjiam9#
我也有同样的问题。我处理了以下几个问题:
我的超级填充是文本输入