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中的此功能,因为它不能用特定于平台的解决方案回答问题。它重定向到一个看起来不正确的库有一个等价物。