Javascript 为什么不是';t toLocaleDateString在react native(Android)中工作?
出于一些奇怪的原因,Javascript 为什么不是';t toLocaleDateString在react native(Android)中工作?,javascript,date,react-native,Javascript,Date,React Native,出于一些奇怪的原因,toLocaleDateString在react native中无法正常工作。有时有效,有时无效。对于以下代码 const dateString = this.state.date.toLocaleDateString('en-US', { weekday: 'short', day: 'numeric', month: 'long', year: 'numeric',
toLocaleDateString
在react native中无法正常工作。有时有效,有时无效。对于以下代码
const dateString = this.state.date.toLocaleDateString('en-US', {
weekday: 'short',
day: 'numeric',
month: 'long',
year: 'numeric',
});
有时我只得到2018年7月17日的
。现在我可以自己实现它,或者使用moment.js
之类的东西。我想知道为什么会出现这种情况。在非调试模式下反应本机使用的JavaScriptCore引擎&它不能很好地处理日期,但在调试期间工作,因为它在调试时使用chrome V8引擎
所以最好使用或JavaScript库。是正确的。最好使用矩或XDate
但我选择编写一个小函数,而不是导入整个库
function getDateString(date) {
if (Platform.OS === 'ios')
return date.toLocaleDateString('en-US', {
weekday: 'short',
day: 'numeric',
month: 'long',
year: 'numeric',
});
else {
var
dayOfWeek = ["Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"],
monthName = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"],
utc = date.getTime() + date.getTimezoneOffset() * 60000,
US_time = utc + (3600000 * -4),
US_date = new Date(US_time);
return dayOfWeek[US_date.getDay()-1] + ", " + monthName[US_date.getMonth()] +
" " + US_date.getDate() + ", " + US_date.getFullYear();
}
}
我曾经说过,这里有一个例子:
import i18n from '../i18n';
const moment = require('moment');
moment.locale('es', {
months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
weekdays : 'domingo_lunes_martes_miercoles_jueves_viernes_sábado'.split('_'),
relativeTime : {
future : 'dentro de %s',
past : 'hace %s',
s : 'algunos segundos',
m : 'un minuto',
mm : '%d minutos',
h : 'una hora',
hh : '%d horas',
d : 'un día',
dd : '%d días',
M : 'un mes',
MM : '%d meses',
y : 'un año',
yy : '%d años'
}
});
export const translateDate = date => {
const currentLanguage = i18n.language;
moment.locale(currentLanguage); // or moment.locale('es')
const dateString = moment(date).format('dddd Do MMMM, YYYY');
return dateString.charAt(0).toUpperCase() + dateString.slice(1)
}
然后您可以在组件中使用它:
<View style={Styles().containerDate}>
<Input
inputContainerStyle={Styles().inputContainerStyle}
inputStyle={Styles().inputText}
editable={false}
label={i18n.t(`${i18nConfinement}.startdate`)}
placeholderTextColor={Styles().placeholder.color}
value={translateDate(startDate)}
/>
<Icon onPress={() => setShowStartDate(!showStartDate)} size={25} name={showStartDate ? 'calendar-check-o' : 'calendar'} color={Styles().icon.color} type='font-awesome' />
</View>
setShowStartDate(!showStartDate)}size={25}name={showStartDate?'calendar-check-o':'calendar'}color={style().icon.color}type='font-awesome'/>
是一篇关于如何使用moment.js管理日期的文章
最终结果:
如果(Platform.OS==='ios')
请不要这样做。曾经经过20多年的网络开发,你又回到了嗅探平台?不。你为什么要用主机时区偏移量做什么?ToLocalString使用主机偏移量,除非使用了,而OP没有使用。即使您想调整到另一个偏移量,也只需使用UTC方法并完全忽略主机偏移量。RobG在实践中,我发现在源代码中使用平台测试很方便。如果您有信心在react native中使用源代码,那么它可以节省大量时间,而且没有任何不利之处。理论上,我不能不同意。现实不是理论。看起来,我在排序方面也有问题,你能指出一些资源,其中记录了JavaScriptCore
的所有限制吗?或者知道如何使用JavaScriptCore
进行调试?以及如何使用moment进行LocaledTestRing?@DimitriKopriwa您能再解释一下您的问题吗?您如何替换AndroidI downvoted中的此功能,因为它不能用特定于平台的解决方案回答问题。它重定向到一个看起来不正确的库有一个等价物。