当前位置: 首页 > 知识库问答 >
问题:

如何在xAxis条形图MPAndroidChart上设置日期时间的字符串值

江礼骞
2023-03-14

我正在尝试在X轴上为我的条形图显示日期时间。我从我的UNIX时间戳火库数据库中获得了这些数据。我一直在尝试将此UNIX时间戳转换为人类可读的日期,然后在我的Axis上显示它。据我所知,BarEntry构造函数不支持像String这样的数据类型。所以,我应该使用xAxis.setValueFormatter()来显示日期。我尝试过使用格式化程序,但它似乎是错误的,比如重叠图和X轴显示不正确的结果。这是我的格式化程序:


     public class FooFormatter extends ValueFormatter {

        private long referenceTimestamp; // minimum timestamp
        private DateFormat mDataFormat;
        private Date mDate;

        public FooFormatter(long referenceTimestamp) {
            this.referenceTimestamp = referenceTimestamp;
            this.mDataFormat = new SimpleDateFormat( "HH:mm", Locale.ENGLISH );
            this.mDate = new Date();
        }

        @Override
        public String getFormattedValue(float value) {
            // convertedTimestamp = originalTimestamp - referenceTimestamp
            long convertedTimestamp = (long) value;

            // Retrieve original timestamp
            long originalTimestamp = referenceTimestamp + convertedTimestamp;

            // Convert timestamp
            return getDateString(originalTimestamp);
        }

        private String getDateString(long timestamp) {
            try {
                mDate.setTime(timestamp * 1000);
                return mDataFormat.format(mDate);
            } catch(Exception ex) {
                return "xx";
            }
        }

    } 

这是我的数据检索方法:


    public void retrievedata() {

        weightReference.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                int count_test = 1;
                ArrayList<BarEntry> dataValue = new ArrayList<BarEntry>();
                if(dataSnapshot.hasChildren()){
                    for (DataSnapshot myDataSnapshot : dataSnapshot.getChildren()){

                        datapoint DataPoint = myDataSnapshot.getValue(datapoint.class);

                        originalTimestamp = DataPoint.getDate();

                        dataValue.add(new BarEntry(originalTimestamp, DataPoint.getValue()));

                        referenceTimestamp = 1587772800;
                        convertedTimestamp = originalTimestamp - referenceTimestamp;
                    }
                    showChart(dataValue);

                } else {
                    chart.clear();
                    chart.invalidate();
                }
            } 

这就是我如何使用xAxis格式化程序:


    FooFormatter axisValueFormatter = new FooFormatter(convertedTimestamp);
        XAxis xAxis = chart.getXAxis();
        xAxis.setValueFormatter(axisValueFormatter);

资源:https://github.com/PhilJay/MPAndroidChart/issues/789#issuecomment-241507904

共有1个答案

石正卿
2023-03-14

我为x值添加了一个索引,如我所说的0,1,3,4,5..然后我创建了一个日期列表。

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
     int count_test = 1;
     int index = 0;
     ArrayList<BarEntry> dataValue = new ArrayList<BarEntry>();
     ArrayList<Long> dateList = new ArrayList< Long >();
     if(dataSnapshot.hasChildren()){
           for (DataSnapshot myDataSnapshot : dataSnapshot.getChildren()){
               datapoint DataPoint = myDataSnapshot.getValue(datapoint.class);
               originalTimestamp = DataPoint.getDate();
               dataValue.add(new BarEntry(index, DataPoint.getValue()));
               referenceTimestamp = 1587772800;
               convertedTimestamp = originalTimestamp - referenceTimestamp;
               dateList.add(convertedTimestamp);
               index++;
           }
         showChart(dataValue, dateList);

      } else {
          chart.clear();
          chart.invalidate();
      }
  }

我将格式化程序更改为使用日期列表:

public class FooFormatter extends ValueFormatter {

private ArrayList<Long> dateList; // minimum timestamp
private DateFormat mDataFormat;
private Date mDate;

public FooFormatter(ArrayList<Long>  dateList) {
    dateList = dateList;
    this.mDataFormat = new SimpleDateFormat( "HH:mm", Locale.ENGLISH );
    this.mDate = new Date();
}

@Override
public String getFormattedValue(float value) {
    if((int) value < 0 || (int)(value) > longArrayList.size() -1)
        return "";

    // Retrieve original timestamp
    long originalTimestamp = dateList(((int)value));

    // Convert timestamp
    return getDateString(originalTimestamp);
}

private String getDateString(long timestamp) {
    try {
        mDate.setTime(timestamp * 1000);
        return mDataFormat.format(mDate);
    } catch(Exception ex) {
        return "xx";
    }
}

}

axisValueFormatter

FooFormatter axisValueFormatter = new FooFormatter(dateList);
 类似资料:
  • 我刚刚开始学习为Android编码和开发。 现在,我正在尝试这样做:Project Fi App UI然而,我在MPAndroidChart库中找不到参数或方法来设置条形图(或我正在使用的水平条形图)中条形图的比例。条形图中的条形图只是自动决定其比例。我想要的是一个固定的Y轴最大范围,图中条形的比例根据其值而变化。 另一个问题是,我无法摆脱每个酒吧上的标签。我写道 但条的右边仍然有一个值。 包含条

  • 诸葛io的用户属性的属性类型包括字符串、数值、日期三种,您可以在「数据接入」模块儿中的「埋点管理」页面对用户属性的属性类型进行修改。 下面将重点介绍数值型属性: 一、数字类型属性的计算 在添加事件属性时,需注意事件属性类型。如事件属性类型为「数值型属性」,需要在上传数据时修改数据类型为「数值型」,并且在诸葛io后台埋点管理中修改为「数值型」。 事件的数字型属性计算功能,让你可以将事件的数字属性作为

  • 问题内容: 我有一个类似的字符串 。我想将该字符串拆分为单独的变量,例如 这可能吗?如果是这样,我该怎么办? 问题答案: 一种方法是将其解析为日期对象,然后重新格式化: 如果您只想将其切成日期时间片段,只需使用split来获取片段 要么

  • 我有一个本地日期时间的字符串表示和一个Java时区。 我正在尝试以 MM/dd/yyyy HH:mm:ssZ 格式获取输出,但我无法弄清楚如何使用正确的日期时间和时区创建日历或 JodaTime 对象。如何将时区转换为可以通过简单日期格式“Z”或“z”解析的值? 和 返回 这是 。 是创建日历或Joda日期时间并通过解析字符串“08/14/2014 15:00:00”来设置各个年/月/日/小时/分

  • 问题内容: 我有一个来自json响应的字符串: 如何将此字符串转换为Java DateTime对象? 我尝试使用以下内容: 但与此我只能创建一个日期对象。但是绑定在字符串中的时间还是很重要的。 任何帮助是极大的赞赏! 问题答案: 您可以从Java Date对象创建Joda DateTime对象,因为Java没有类。 尽管Java类也保存时间信息(这是您首先需要的信息),但我还是建议您使用a 代替J

  • 问题内容: 我正在研究一个数据仓库项目,并且想知道如何(最好在数据流中的“派生列”组件中)从SQL日期时间记录中删除日期。 将日期时间转换为时间后,我将对时间进行查询,以在时间维度表中找到相关的时间记录。 有人可以给我一个简单的函数,以在派生的列转换中完成此操作吗? 示例:将日期时间(例如“ 12/02/2008 11:32:21 AM”)转换为简单的“ 11:32:21 AM”。 问题答案: 我